From: Francis De Brabandere francisdb@gmail.com
--- dlls/vbscript/global.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 2cc29d25db8..0e03a4e33a4 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -2590,6 +2590,7 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, LONG lbound, ubound; VARIANT *data; BSTR *str_array = NULL; + BSTR *free_str_array = NULL; UINT total_len = 0, delimiter_len = 1, str_len; WCHAR *output_ptr; INT i; @@ -2648,12 +2649,17 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, hres = E_OUTOFMEMORY; goto cleanup_data; } - + free_str_array = (BSTR *)calloc((ubound - lbound + 1), sizeof(BSTR)); + if (!free_str_array) { + hres = E_OUTOFMEMORY; + goto cleanup_data; + } for (i = lbound; i <= ubound; i++) { if (V_VT(&data[i]) != VT_BSTR) { hres = to_string(&data[i], &str); if (FAILED(hres)) goto cleanup_data; + free_str_array[i - lbound] = str; } else { str = V_BSTR(&data[i]); } @@ -2687,17 +2693,18 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, }
*output_ptr = L'\0'; - SafeArrayUnaccessData(sa); - SysFreeString(free_delimiter); - free(str_array); - - return return_bstr(res, output); + hres = return_bstr(res, output);
cleanup_data: SafeArrayUnaccessData(sa); cleanup: SysFreeString(free_delimiter); free(str_array); + if (free_str_array) { + for (i = 0; i <= ubound - lbound; i++) + SysFreeString(free_str_array[i]); + free(free_str_array); + } return hres; }