Module: wine Branch: master Commit: 70cd4153c558fbfba9ddb86a591872ce55d4184e URL: https://source.winehq.org/git/wine.git/?a=commit;h=70cd4153c558fbfba9ddb86a5...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Jan 22 23:27:09 2020 +0100
vbscript: Alloc vbscode_t before parsing the script.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/vbscript/compile.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index c76ba73bd8..4a1f1a5c6a 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -1851,16 +1851,24 @@ void release_vbscode(vbscode_t *code) static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source) { vbscode_t *ret; + size_t len; + + len = source ? lstrlenW(source) : 0; + if(len > INT32_MAX) + return NULL;
ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return NULL;
- ret->source = heap_strdupW(source); + ret->source = heap_alloc((len + 1) * sizeof(WCHAR)); if(!ret->source) { heap_free(ret); return NULL; } + if(len) + memcpy(ret->source, source, len * sizeof(WCHAR)); + ret->source[len] = 0;
ret->instrs = heap_alloc(32*sizeof(instr_t)); if(!ret->instrs) { @@ -1872,8 +1880,6 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source) ctx->instr_size = 32; heap_pool_init(&ret->heap);
- ret->option_explicit = ctx->parser.option_explicit; - ret->main_code.type = FUNC_GLOBAL; ret->main_code.code_ctx = ret; ret->ref = 1; @@ -1899,15 +1905,16 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli vbscode_t *code; HRESULT hres;
- if (!src) src = L""; - - hres = parse_script(&ctx.parser, src, delimiter, flags); - if(FAILED(hres)) - return compile_error(script, hres); - code = ctx.code = alloc_vbscode(&ctx, src); if(!ctx.code) - return compile_error(script, E_OUTOFMEMORY); + return E_OUTOFMEMORY; + + hres = parse_script(&ctx.parser, code->source, delimiter, flags); + if(FAILED(hres)) { + hres = compile_error(script, hres); + release_vbscode(code); + return hres; + }
ctx.func_decls = NULL; ctx.labels = NULL; @@ -1922,6 +1929,8 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli }
ctx.global_consts = ctx.const_decls; + code->option_explicit = ctx.parser.option_explicit; +
for(func_decl = ctx.func_decls; func_decl; func_decl = func_decl->next) { hres = create_function(&ctx, func_decl, &new_func);