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;