Commit a5755b10 authored by Alexandre Julliard's avatar Alexandre Julliard

Authors: Mike McCormack <mikem@codeweavers.com>, Jeremy White <jwhite@codeweavers.com>

Fixed memory leaks.
parent bf2c7efa
...@@ -885,6 +885,8 @@ HRESULT WINAPI IStream16_fnWrite( ...@@ -885,6 +885,8 @@ HRESULT WINAPI IStream16_fnWrite(
* (we just migrate newsize bytes) * (we just migrate newsize bytes)
*/ */
LPBYTE curdata,data = HeapAlloc(GetProcessHeap(),0,newsize+BIGSIZE); LPBYTE curdata,data = HeapAlloc(GetProcessHeap(),0,newsize+BIGSIZE);
HRESULT r = E_FAIL;
cc = newsize; cc = newsize;
blocknr = This->stde.pps_sb; blocknr = This->stde.pps_sb;
curdata = data; curdata = data;
...@@ -899,31 +901,35 @@ HRESULT WINAPI IStream16_fnWrite( ...@@ -899,31 +901,35 @@ HRESULT WINAPI IStream16_fnWrite(
} }
/* frees complete chain for this stream */ /* frees complete chain for this stream */
if (!STORAGE_set_big_chain(hf,This->stde.pps_sb,STORAGE_CHAINENTRY_FREE)) if (!STORAGE_set_big_chain(hf,This->stde.pps_sb,STORAGE_CHAINENTRY_FREE))
return E_FAIL; goto err;
curdata = data; curdata = data;
blocknr = This->stde.pps_sb = STORAGE_get_free_small_blocknr(hf); blocknr = This->stde.pps_sb = STORAGE_get_free_small_blocknr(hf);
if (blocknr<0) if (blocknr<0)
return E_FAIL; goto err;
cc = newsize; cc = newsize;
while (cc>0) { while (cc>0) {
if (!STORAGE_put_small_block(hf,blocknr,curdata)) if (!STORAGE_put_small_block(hf,blocknr,curdata))
return E_FAIL; goto err;
cc -= SMALLSIZE; cc -= SMALLSIZE;
if (cc<=0) { if (cc<=0) {
if (!STORAGE_set_small_chain(hf,blocknr,STORAGE_CHAINENTRY_ENDOFCHAIN)) if (!STORAGE_set_small_chain(hf,blocknr,STORAGE_CHAINENTRY_ENDOFCHAIN))
return E_FAIL; goto err;
break; break;
} else { } else {
int newblocknr = STORAGE_get_free_small_blocknr(hf); int newblocknr = STORAGE_get_free_small_blocknr(hf);
if (newblocknr<0) if (newblocknr<0)
return E_FAIL; goto err;
if (!STORAGE_set_small_chain(hf,blocknr,newblocknr)) if (!STORAGE_set_small_chain(hf,blocknr,newblocknr))
return E_FAIL; goto err;
blocknr = newblocknr; blocknr = newblocknr;
} }
curdata += SMALLSIZE; curdata += SMALLSIZE;
} }
r = S_OK;
err:
HeapFree(GetProcessHeap(),0,data); HeapFree(GetProcessHeap(),0,data);
if(r != S_OK)
return r;
} }
} }
This->stde.pps_size = newsize; This->stde.pps_size = newsize;
...@@ -978,47 +984,51 @@ HRESULT WINAPI IStream16_fnWrite( ...@@ -978,47 +984,51 @@ HRESULT WINAPI IStream16_fnWrite(
} else { } else {
/* Migrate small blocks to big blocks */ /* Migrate small blocks to big blocks */
LPBYTE curdata,data = HeapAlloc(GetProcessHeap(),0,oldsize+BIGSIZE); LPBYTE curdata,data = HeapAlloc(GetProcessHeap(),0,oldsize+BIGSIZE);
HRESULT r = E_FAIL;
cc = oldsize; cc = oldsize;
blocknr = This->stde.pps_sb; blocknr = This->stde.pps_sb;
curdata = data; curdata = data;
/* slurp in */ /* slurp in */
while (cc>0) { while (cc>0) {
if (!STORAGE_get_small_block(hf,blocknr,curdata)) { if (!STORAGE_get_small_block(hf,blocknr,curdata))
HeapFree(GetProcessHeap(),0,data); goto err2;
return E_FAIL;
}
curdata += SMALLSIZE; curdata += SMALLSIZE;
cc -= SMALLSIZE; cc -= SMALLSIZE;
blocknr = STORAGE_get_next_small_blocknr(hf,blocknr); blocknr = STORAGE_get_next_small_blocknr(hf,blocknr);
} }
/* free small block chain */ /* free small block chain */
if (!STORAGE_set_small_chain(hf,This->stde.pps_sb,STORAGE_CHAINENTRY_FREE)) if (!STORAGE_set_small_chain(hf,This->stde.pps_sb,STORAGE_CHAINENTRY_FREE))
return E_FAIL; goto err2;
curdata = data; curdata = data;
blocknr = This->stde.pps_sb = STORAGE_get_free_big_blocknr(hf); blocknr = This->stde.pps_sb = STORAGE_get_free_big_blocknr(hf);
if (blocknr<0) if (blocknr<0)
return E_FAIL; goto err2;
/* put the data into the big blocks */ /* put the data into the big blocks */
cc = This->stde.pps_size; cc = This->stde.pps_size;
while (cc>0) { while (cc>0) {
if (!STORAGE_put_big_block(hf,blocknr,curdata)) if (!STORAGE_put_big_block(hf,blocknr,curdata))
return E_FAIL; goto err2;
cc -= BIGSIZE; cc -= BIGSIZE;
if (cc<=0) { if (cc<=0) {
if (!STORAGE_set_big_chain(hf,blocknr,STORAGE_CHAINENTRY_ENDOFCHAIN)) if (!STORAGE_set_big_chain(hf,blocknr,STORAGE_CHAINENTRY_ENDOFCHAIN))
return E_FAIL; goto err2;
break; break;
} else { } else {
int newblocknr = STORAGE_get_free_big_blocknr(hf); int newblocknr = STORAGE_get_free_big_blocknr(hf);
if (newblocknr<0) if (newblocknr<0)
return E_FAIL; goto err2;
if (!STORAGE_set_big_chain(hf,blocknr,newblocknr)) if (!STORAGE_set_big_chain(hf,blocknr,newblocknr))
return E_FAIL; goto err2;
blocknr = newblocknr; blocknr = newblocknr;
} }
curdata += BIGSIZE; curdata += BIGSIZE;
} }
r = S_OK;
err2:
HeapFree(GetProcessHeap(),0,data); HeapFree(GetProcessHeap(),0,data);
if(r != S_OK)
return r;
} }
/* generate big blocks to fit the new data */ /* generate big blocks to fit the new data */
lastblocknr = blocknr; lastblocknr = blocknr;
......
...@@ -115,9 +115,9 @@ inline static void queue_file_op( struct file_op_queue *queue, struct file_op *o ...@@ -115,9 +115,9 @@ inline static void queue_file_op( struct file_op_queue *queue, struct file_op *o
/* free all the file operations on a given queue */ /* free all the file operations on a given queue */
static void free_file_op_queue( struct file_op_queue *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_root );
HeapFree( GetProcessHeap(), 0, op->src_path ); HeapFree( GetProcessHeap(), 0, op->src_path );
...@@ -126,6 +126,9 @@ static void free_file_op_queue( struct file_op_queue *queue ) ...@@ -126,6 +126,9 @@ static void free_file_op_queue( struct file_op_queue *queue )
HeapFree( GetProcessHeap(), 0, op->src_tag ); HeapFree( GetProcessHeap(), 0, op->src_tag );
HeapFree( GetProcessHeap(), 0, op->dst_path ); HeapFree( GetProcessHeap(), 0, op->dst_path );
if (op->dst_file != op->src_file) HeapFree( GetProcessHeap(), 0, op->dst_file ); if (op->dst_file != op->src_file) HeapFree( GetProcessHeap(), 0, op->dst_file );
t = op;
op = op->next;
HeapFree( GetProcessHeap(), 0, t );
} }
} }
......
...@@ -711,6 +711,7 @@ DWORD WINAPI FormatMessage16( ...@@ -711,6 +711,7 @@ DWORD WINAPI FormatMessage16(
b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz); b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz);
} }
for (x=b; *x; x++) ADD_TO_T(*x); for (x=b; *x; x++) ADD_TO_T(*x);
HeapFree(GetProcessHeap(), 0, b);
} else { } else {
/* NULL args - copy formatstr /* NULL args - copy formatstr
* (probably wrong) * (probably wrong)
......
...@@ -1053,6 +1053,7 @@ static POINT WINPOS_FindIconPos( WND* wndPtr, POINT pt ) ...@@ -1053,6 +1053,7 @@ static POINT WINPOS_FindIconPos( WND* wndPtr, POINT pt )
/* No window was found, so it's OK for us */ /* No window was found, so it's OK for us */
pt.x = x + (xspacing - GetSystemMetrics(SM_CXICON)) / 2; pt.x = x + (xspacing - GetSystemMetrics(SM_CXICON)) / 2;
pt.y = y - (yspacing + GetSystemMetrics(SM_CYICON)) / 2; pt.y = y - (yspacing + GetSystemMetrics(SM_CYICON)) / 2;
HeapFree( GetProcessHeap(), 0, list );
return pt; return pt;
} while(x <= rectParent.right-xspacing); } while(x <= rectParent.right-xspacing);
......
...@@ -1222,15 +1222,16 @@ static BOOL PATH_PathToRegion(GdiPath *pPath, INT nPolyFillMode, ...@@ -1222,15 +1222,16 @@ static BOOL PATH_PathToRegion(GdiPath *pPath, INT nPolyFillMode,
/* Create a region from the strokes */ /* Create a region from the strokes */
hrgn=CreatePolyPolygonRgn(pPath->pPoints, pNumPointsInStroke, hrgn=CreatePolyPolygonRgn(pPath->pPoints, pNumPointsInStroke,
numStrokes, nPolyFillMode); numStrokes, nPolyFillMode);
/* Free memory for number-of-points-in-stroke array */
HeapFree( GetProcessHeap(), 0, pNumPointsInStroke );
if(hrgn==(HRGN)0) if(hrgn==(HRGN)0)
{ {
SetLastError(ERROR_NOT_ENOUGH_MEMORY); SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE; return FALSE;
} }
/* Free memory for number-of-points-in-stroke array */
HeapFree( GetProcessHeap(), 0, pNumPointsInStroke );
/* Success! */ /* Success! */
*pHrgn=hrgn; *pHrgn=hrgn;
return TRUE; return TRUE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment