Authors: Mike McCormack <mikem@codeweavers.com>, Jeremy White <jwhite@codeweavers.com>
Fixed memory leaks.
diff --git a/dlls/ole32/storage.c b/dlls/ole32/storage.c
index ac9c791..2cfc5ae 100644
--- a/dlls/ole32/storage.c
+++ b/dlls/ole32/storage.c
@@ -885,6 +885,8 @@
* (we just migrate newsize bytes)
*/
LPBYTE curdata,data = HeapAlloc(GetProcessHeap(),0,newsize+BIGSIZE);
+ HRESULT r = E_FAIL;
+
cc = newsize;
blocknr = This->stde.pps_sb;
curdata = data;
@@ -899,31 +901,35 @@
}
/* frees complete chain for this stream */
if (!STORAGE_set_big_chain(hf,This->stde.pps_sb,STORAGE_CHAINENTRY_FREE))
- return E_FAIL;
+ goto err;
curdata = data;
blocknr = This->stde.pps_sb = STORAGE_get_free_small_blocknr(hf);
if (blocknr<0)
- return E_FAIL;
+ goto err;
cc = newsize;
while (cc>0) {
if (!STORAGE_put_small_block(hf,blocknr,curdata))
- return E_FAIL;
+ goto err;
cc -= SMALLSIZE;
if (cc<=0) {
if (!STORAGE_set_small_chain(hf,blocknr,STORAGE_CHAINENTRY_ENDOFCHAIN))
- return E_FAIL;
+ goto err;
break;
} else {
int newblocknr = STORAGE_get_free_small_blocknr(hf);
if (newblocknr<0)
- return E_FAIL;
+ goto err;
if (!STORAGE_set_small_chain(hf,blocknr,newblocknr))
- return E_FAIL;
+ goto err;
blocknr = newblocknr;
}
curdata += SMALLSIZE;
}
+ r = S_OK;
+ err:
HeapFree(GetProcessHeap(),0,data);
+ if(r != S_OK)
+ return r;
}
}
This->stde.pps_size = newsize;
@@ -978,47 +984,51 @@
} else {
/* Migrate small blocks to big blocks */
LPBYTE curdata,data = HeapAlloc(GetProcessHeap(),0,oldsize+BIGSIZE);
+ HRESULT r = E_FAIL;
+
cc = oldsize;
blocknr = This->stde.pps_sb;
curdata = data;
/* slurp in */
while (cc>0) {
- if (!STORAGE_get_small_block(hf,blocknr,curdata)) {
- HeapFree(GetProcessHeap(),0,data);
- return E_FAIL;
- }
+ if (!STORAGE_get_small_block(hf,blocknr,curdata))
+ goto err2;
curdata += SMALLSIZE;
cc -= SMALLSIZE;
blocknr = STORAGE_get_next_small_blocknr(hf,blocknr);
}
/* free small block chain */
if (!STORAGE_set_small_chain(hf,This->stde.pps_sb,STORAGE_CHAINENTRY_FREE))
- return E_FAIL;
+ goto err2;
curdata = data;
blocknr = This->stde.pps_sb = STORAGE_get_free_big_blocknr(hf);
if (blocknr<0)
- return E_FAIL;
+ goto err2;
/* put the data into the big blocks */
cc = This->stde.pps_size;
while (cc>0) {
if (!STORAGE_put_big_block(hf,blocknr,curdata))
- return E_FAIL;
+ goto err2;
cc -= BIGSIZE;
if (cc<=0) {
if (!STORAGE_set_big_chain(hf,blocknr,STORAGE_CHAINENTRY_ENDOFCHAIN))
- return E_FAIL;
+ goto err2;
break;
} else {
int newblocknr = STORAGE_get_free_big_blocknr(hf);
if (newblocknr<0)
- return E_FAIL;
+ goto err2;
if (!STORAGE_set_big_chain(hf,blocknr,newblocknr))
- return E_FAIL;
+ goto err2;
blocknr = newblocknr;
}
curdata += BIGSIZE;
}
+ r = S_OK;
+ err2:
HeapFree(GetProcessHeap(),0,data);
+ if(r != S_OK)
+ return r;
}
/* generate big blocks to fit the new data */
lastblocknr = blocknr;
diff --git a/dlls/setupapi/queue.c b/dlls/setupapi/queue.c
index 59e0617..db7f7ae 100644
--- a/dlls/setupapi/queue.c
+++ b/dlls/setupapi/queue.c
@@ -115,9 +115,9 @@
/* free all the file operations on a given queue */
static void free_file_op_queue( struct file_op_queue *queue )
{
- struct file_op *op;
+ struct file_op *t, *op = queue->head;
- for (op = queue->head; op; op = op->next)
+ while( op )
{
HeapFree( GetProcessHeap(), 0, op->src_root );
HeapFree( GetProcessHeap(), 0, op->src_path );
@@ -126,6 +126,9 @@
HeapFree( GetProcessHeap(), 0, op->src_tag );
HeapFree( GetProcessHeap(), 0, op->dst_path );
if (op->dst_file != op->src_file) HeapFree( GetProcessHeap(), 0, op->dst_file );
+ t = op;
+ op = op->next;
+ HeapFree( GetProcessHeap(), 0, t );
}
}
diff --git a/dlls/user/lstr.c b/dlls/user/lstr.c
index a7f0515..dbf99b1 100644
--- a/dlls/user/lstr.c
+++ b/dlls/user/lstr.c
@@ -711,6 +711,7 @@
b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz);
}
for (x=b; *x; x++) ADD_TO_T(*x);
+ HeapFree(GetProcessHeap(), 0, b);
} else {
/* NULL args - copy formatstr
* (probably wrong)
diff --git a/dlls/x11drv/winpos.c b/dlls/x11drv/winpos.c
index c4be59f..dd3df9b 100644
--- a/dlls/x11drv/winpos.c
+++ b/dlls/x11drv/winpos.c
@@ -1053,6 +1053,7 @@
/* No window was found, so it's OK for us */
pt.x = x + (xspacing - GetSystemMetrics(SM_CXICON)) / 2;
pt.y = y - (yspacing + GetSystemMetrics(SM_CYICON)) / 2;
+ HeapFree( GetProcessHeap(), 0, list );
return pt;
} while(x <= rectParent.right-xspacing);
diff --git a/graphics/path.c b/graphics/path.c
index 522066d..befd345 100644
--- a/graphics/path.c
+++ b/graphics/path.c
@@ -1222,15 +1222,16 @@
/* Create a region from the strokes */
hrgn=CreatePolyPolygonRgn(pPath->pPoints, pNumPointsInStroke,
numStrokes, nPolyFillMode);
+
+ /* Free memory for number-of-points-in-stroke array */
+ HeapFree( GetProcessHeap(), 0, pNumPointsInStroke );
+
if(hrgn==(HRGN)0)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
- /* Free memory for number-of-points-in-stroke array */
- HeapFree( GetProcessHeap(), 0, pNumPointsInStroke );
-
/* Success! */
*pHrgn=hrgn;
return TRUE;