Memory access error in XWin -multiwindow

Harold L Hunt II huntharo@msu.edu
Tue Jul 8 19:14:00 GMT 2003


Biju,

I just tried my idea of preventing multiple calls to XInitThreads... it 
didn't seem to make any difference at all.  I will have to look at this 
problem more closely... which means that I won't be able to work on it 
for a while.  I will be out of town this weekend and I am moving across 
town next week, so I will be pretty busy.

Harold

Harold L Hunt II wrote:

> 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