On Tue, 10 Feb 2009, Nikolay Sivov wrote: [...]
Why didn't you replace corresponding free() calls?
Also, for everyone's information, there's more calls to malloc() and free(). I only grepped in the dlls/ directory where they are the most suspicious. I removed some obvious false positives but there may be more. Here's what I got:
dlls/itss/lzx.c:181: pState = malloc(sizeof(struct LZXstate)); dlls/itss/lzx.c:182: if (!(pState->window = malloc(wndsize))) dlls/rsaenh/mpi.c:157: a->dp = malloc (sizeof (mp_digit) * MP_PREC); dlls/rsaenh/mpi.c:185: a->dp = malloc (sizeof (mp_digit) * size); dlls/rsaenh/mpi.c:3381: tmp = malloc(bsize); dlls/twain_32/dsm_ctrl.c:89: devices = malloc(sizeof(devices[0])); dlls/winedos/dosconf.c:267: DOSCONF_config.country = malloc(strlen(*confline) + 1); dlls/winedos/dosconf.c:307: DOSCONF_config.shell = malloc(strlen(*confline) + 1); dlls/winedos/dosconf.c:370: DOSCONF_menu_default = malloc(strlen(*confline) + 1); dlls/winedos/dosconf.c:387: temp = malloc(strlen(*confline) + 1); dlls/winedos/dosvm.c:260: event = malloc(sizeof(DOSEVENT)); dlls/winedos/ppdev.c:184: PPDeviceList[nports].devicename = malloc(sizeof(buffer)+1); dlls/winemp3.acm/interface.c:74: nbuf = malloc( sizeof(struct buf) ); dlls/winemp3.acm/interface.c:79: nbuf->pnt = malloc(size); dlls/winenas.drv/audio.c:1383: void *newbuf = malloc(wwo->BufferUsed + len); dlls/winenas.drv/audio.c:1418: ptr = malloc(len); dlls/winenas.drv/audio.c:1420: newdata = malloc(wwo->BufferUsed - len); dlls/winhttp/net.c:634: * SSL 0.9.7 and above malloc the buffer if it is null. dlls/winhttp/net.c:653: if (malloc) free( buffer );
dlls/ddraw/tests/ddrawmodes.c:95: modes = malloc((modes_size = 2) * sizeof(DDSURFACEDESC)); dlls/dsound/tests/ds3d.c:51: b=buf=malloc(*size); dlls/lz32/tests/lzexpand_main.c:884: buf = malloc(uncompressed_data_size * 2); dlls/oleaut32/tests/vartype.c:35:# include <malloc.h> dlls/rpcrt4/tests/server.c:1202: dc = malloc(FIELD_OFFSET(doub_carr_t, a[2])); dlls/rpcrt4/tests/server.c:1204: dc->a[0] = malloc(FIELD_OFFSET(doub_carr_1_t, a[3])); dlls/rpcrt4/tests/server.c:1209: dc->a[1] = malloc(FIELD_OFFSET(doub_carr_1_t, a[2])); dlls/rpcrt4/tests/server.c:56: return malloc(n); dlls/shell32/tests/shlexec.c:336: cmd=malloc(strlen(argv0)+10+strlen(child_file)+2+strlen(cmdtail)+1);
dlls/dbghelp/msc.c:2480: free(files_image); dlls/itss/lzx.c:184: free(pState); dlls/itss/lzx.c:220: free(pState->window); dlls/itss/lzx.c:221: free(pState); dlls/ntdll/server.c:752: free( tmp_dir ); dlls/rsaenh/mpi.c:217: free(a->dp); dlls/rsaenh/mpi.c:3446: free(tmp); dlls/winedos/dosconf.c:357: free(DOSCONF_menu_default); dlls/winedos/dosconf.c:390: free(temp); dlls/winedos/dosvm.c:185: free(event); dlls/winedos/dosvm.c:625: free(event); dlls/winedos/int33.c:221: free(data); dlls/winejack.drv/audio.c:2006: free(ports); /* free the returned array of ports */ dlls/winejack.drv/audio.c:735: free(ports); /* free the returned array of ports */ dlls/winemp3.acm/interface.c:115: free(buf->pnt); dlls/winemp3.acm/interface.c:116: free(buf); dlls/winemp3.acm/interface.c:60: free(b->pnt); dlls/winemp3.acm/interface.c:62: free(b); dlls/winemp3.acm/interface.c:81: free(nbuf); dlls/winenas.drv/audio.c:1387: free(oldbuf); dlls/winenas.drv/audio.c:1432: free(ptr); dlls/wininet/netconnection.c:753: free(buffer);
dlls/ddraw/tests/ddrawmodes.c:104: free(modes); dlls/dsound/tests/ds3d8.c:521: free(state.wave); dlls/dsound/tests/ds3d.c:677: free(state.wave); dlls/lz32/tests/lzexpand_main.c:889: free(buf); dlls/ntdll/tests/rtlstr.c:1367: free(wstr); dlls/ntdll/tests/rtlstr.c:1407: free(wstr); dlls/ntdll/tests/rtlstr.c:296: free(teststring2); dlls/rpcrt4/tests/server.c:1214: free(dc->a[0]); dlls/rpcrt4/tests/server.c:1215: free(dc->a[1]); dlls/rpcrt4/tests/server.c:1216: free(dc); dlls/rpcrt4/tests/server.c:62: free(p); dlls/shell32/tests/shlexec.c:340: free(cmd);
Notes: * It's probably not as bad to use malloc() in tests but it should still be avoided. * Using #include <malloc.h> when not using malloc is wrong. * Some calls to malloc() and free() may be required by the Unix APIs that are called. This should be checked on a case by case basis. * If the above don't have too many false positives I could integrate that check into my scripts.