Module: wine Branch: master Commit: 4e2c87dd22cae51c6f27521fc3061150f06f2595 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e2c87dd22cae51c6f27521fc3...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Mar 9 14:31:28 2009 +0100
wined3d: Handle error conditions better in RemoveContextFromArray().
---
dlls/wined3d/context.c | 55 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 37 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 3258909..6353aa7 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -919,31 +919,50 @@ out: * *****************************************************************************/ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *context) { - UINT t, s; - WineD3DContext **oldArray = This->contexts; + WineD3DContext **new_array; + BOOL found = FALSE; + UINT i;
TRACE("Removing ctx %p\n", context);
- This->numContexts--; - - if(This->numContexts) { - This->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->contexts) * This->numContexts); - if(!This->contexts) { - ERR("Cannot allocate a new context array, PANIC!!!\n"); - } - t = 0; - /* Note that we decreased numContexts a few lines up, so use '<=' instead of '<' */ - for(s = 0; s <= This->numContexts; s++) { - if(oldArray[s] == context) continue; - This->contexts[t] = oldArray[s]; - t++; + for (i = 0; i < This->numContexts; ++i) + { + if (This->contexts[i] == context) + { + HeapFree(GetProcessHeap(), 0, context); + found = TRUE; + break; } - } else { + } + + if (!found) + { + ERR("Context %p doesn't exist in context array\n", context); + return; + } + + while (i < This->numContexts - 1) + { + This->contexts[i] = This->contexts[i + 1]; + ++i; + } + + --This->numContexts; + if (!This->numContexts) + { + HeapFree(GetProcessHeap(), 0, This->contexts); This->contexts = NULL; + return; }
- HeapFree(GetProcessHeap(), 0, context); - HeapFree(GetProcessHeap(), 0, oldArray); + new_array = HeapReAlloc(GetProcessHeap(), 0, This->contexts, This->numContexts * sizeof(*This->contexts)); + if (!new_array) + { + ERR("Failed to shrink context array. Oh well.\n"); + return; + } + + This->contexts = new_array; }
/*****************************************************************************