Memory access error in XWin -multiwindow
Harold L Hunt II
huntharo@msu.edu
Tue Jul 8 16:23:00 GMT 2003
Biju,
I can now reproduce your problem using both Test91 and Test91-DEBUG
(with Ralf's patches applied). I reproduce the problem using ssh to
login to my home machine which is on an 256 Kbps uplink. When I launch
konqueror remotely, XWin.exe dies with the Windows error message. I
tried the same thing at home on the local network with no problems.
Thus, we are most likely looking at a race condition.
I think that this problem probably doesn't have anything to do with
malloc failing... rather, I think the problem is that we call
XInitThreads (or whatever it is called) more than once in the same
process. I should add protection so that that function is only called
once for the entire process.
I don't promise that this will fix the problem, but I at least have a
test case now so I can start to do something about it.
Harold
Biju G C wrote:
> Harold,
>
> I am facing an issue of Memory access error in XWin -multiwindow mode
> see http://www.cygwin.com/ml/cygwin-xfree/2003-06/msg00294.html
>
> So Ralf pointed me to http://cygwin.com/ml/cygwin-xfree/2003-06/msg00162.html
>
> After seeing that patch, I have just gone thru XWin Source and found,
> at lot of place we call memory alloc and not testing the return value.
> I am attaching the list & extracts from programs
> I dont know all of those will make any issue.
>
> I did not checked whether it is properly "free()"-ed
> And also I did not checked the functions which receives
> allocated memory another function as return value or thru
> a passed argument to the called function.
>
>
> List of variables:-
>
> in winmultiwindowwm.c
> pXMsgArg at function winInitWM
>
>
> in winmultiwindowwindow.c
> vlist at function winMoveXWindow
> vlist at function winResizeXWindow
>
>
> in winmultiwindowicons.c
> iconData at function winScaleXBitmapToWindows
> image at function winXIconToHICON
> imageMask at function winXIconToHICON
> mask at function winXIconToHICON
>
>
> in winmultiwindowclass.c
> *res_name at function winMultiWindowGetClassHint
> *res_role at function winMultiWindowGetWindowRole
>
>
> in winconfig.c
> ret at function winNormalizeName
>
>
> in winclipboardxevents.c
> pszUTF8 at function winClipboardFlushXEvents
> pszReturnData at function winClipboardFlushXEvents
> pwszUnicodeStr at function winClipboardFlushXEvents
> hGlobal at function winClipboardFlushXEvents
>
>
> in winclipboardtextconv.c
> pszDestBegin / pszDest at function winClipboardUNIXtoDOS
>
>
>
>
> ####### EXTRACTS FROM PROGRAMS ##########
>
>
>
> ####### NEXT FILE ##########
>
> winmultiwindowwm.c
>
> Bool
> winInitWM (void **ppWMInfo,
> pthread_t *ptWMProc,
> pthread_t *ptXMsgProc,
> pthread_mutex_t *ppmServerStarted,
> int dwScreen)
> {
> WMProcArgPtr pArg = (WMProcArgPtr) malloc (sizeof(WMProcArgRec));
> WMInfoPtr pWMInfo = (WMInfoPtr) malloc (sizeof(WMInfoRec));
> XMsgProcArgPtr pXMsgArg = (XMsgProcArgPtr) malloc (sizeof(XMsgProcArgRec));
>
> /* Bail if the input parameters are bad */
> if (pArg == NULL || pWMInfo == NULL)
> {
> ErrorF ("winInitWM - malloc fail.\n");
> return FALSE;
> }
>
>
>
>
> ####### NEXT FILE ##########
>
> winmultiwindowwindow.c
>
> void
> winMoveXWindow (WindowPtr pWin, int x, int y)
> {
> XID *vlist = malloc(sizeof(long)*2);
>
> (CARD32*)vlist[0] = x;
> (CARD32*)vlist[1] = y;
> ConfigureWindow (pWin, CWX | CWY, vlist, wClient(pWin));
> free(vlist);
> }
>
>
> /*
> * winResizeXWindow -
> */
>
> void
> winResizeXWindow (WindowPtr pWin, int w, int h)
> {
> XID *vlist = malloc(sizeof(long)*2);
>
> (CARD32*)vlist[0] = w;
> (CARD32*)vlist[1] = h;
> ConfigureWindow (pWin, CWWidth | CWHeight, vlist, wClient(pWin));
> free(vlist);
> }
>
>
>
> ####### NEXT FILE ##########
>
> winmultiwindowicons.c
>
>
> static void
> winScaleXBitmapToWindows (int iconSize,
> int effBPP,
> PixmapPtr pixmap,
> unsigned char *image)
> {
>
> ........
>
> iconData = malloc (xStride * pixmap->drawable.height);
> miGetImage ((DrawablePtr) &(pixmap->drawable), 0, 0,
> pixmap->drawable.width, pixmap->drawable.height,
> ZPixmap, 0xffffffff, iconData);
>
>
>
>
>
>
> HICON
> winXIconToHICON (WindowPtr pWin)
> {
>
> .........
> image = (unsigned char * ) malloc (stride * iconSize);
> imageMask = (unsigned char *) malloc (stride * iconSize);
> mask = (unsigned char *) malloc (maskStride * iconSize);
>
>
>
>
>
> ####### NEXT FILE ##########
>
> winmultiwindowclass.c
>
> int
> winMultiWindowGetClassHint (WindowPtr pWin, char **res_name, char **res_class)
> {
>
> ....
>
> (*res_name) = malloc (len_name + 1);
>
>
> int
> winMultiWindowGetWindowRole (WindowPtr pWin, char **res_role)
> {
>
> ....
> (*res_role) = malloc (len_role + 1);
>
>
>
>
> ####### NEXT FILE ##########
>
> winconfig.c
>
> char *
> winNormalizeName (const char *s)
> {
>
> ......
>
> ret = malloc (strlen (s) + 1);
>
>
>
>
> ####### NEXT FILE ##########
>
> winclipboardxevents.c
> Bool
> winClipboardFlushXEvents (HWND hwnd,
> Atom atomClipboard,
> Atom atomLocalProperty,
> Atom atomUTF8String,
> Atom atomCompoundText,
> Atom atomTargets,
> Atom atomDeleteWindow,
> int iWindow,
> Display *pDisplay,
> Bool fUnicodeSupport)
> {
>
> ........
> pszUTF8 = (char *) malloc (iUTF8); /* Don't need +1 */
> WideCharToMultiByte (CP_UTF8,
>
>
>
> ...........
>
>
> if (iCount > 0)
> {
> pszReturnData = malloc (strlen (ppszTextList[0]) + 1);
> strcpy (pszReturnData, ppszTextList[0]);
> }
> else
> {
> pszReturnData = malloc (1);
> pszReturnData[0] = 0;
> }
>
>
> ...........
> pwszUnicodeStr
> = (wchar_t*) malloc (sizeof (wchar_t) * (iUnicodeLen + 1));
>
> /* Do the actual conversion */
> MultiByteToWideChar (CP_UTF8,
> 0,
> pszReturnData,
> -1,
> pwszUnicodeStr,
> iUnicodeLen);
>
> ........
>
> /* Allocate global memory for the X clipboard data */
> if (fUnicodeSupport)
> hGlobal = GlobalAlloc (GMEM_MOVEABLE,
> sizeof (wchar_t) * (iUnicodeLen + 1));
> else
> hGlobal = GlobalAlloc (GMEM_MOVEABLE, strlen (pszReturnData) + 1);
>
> /* Obtain a pointer to the global memory */
> pszGlobalData = GlobalLock (hGlobal);
> if (pszGlobalData == NULL)
> {
> ........
>
>
>
>
> ####### NEXT FILE ##########
>
> winclipboardtextconv.c
>
> void
> winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength)
> {
>
> .......
> /* Allocate a new string */
> pszDestBegin = pszDest = malloc (iLength + iNewlineCount + 1);
>
>
>
>
> ________________________________________________________________________
> Want to chat instantly with your online friends? Get the FREE Yahoo!
> Messenger http://uk.messenger.yahoo.com/
More information about the Cygwin-xfree
mailing list