[PATCH 0/2] MR10928: vbscript: Reject re-Dim of an existing global array with err 13.
A separate ExecuteGlobal can re-encounter a name that was already Dim'd as an array (dynamic or fixed) in an earlier compile unit. Native raises err 13 (Type mismatch) for this case. Wine silently accepted the dynamic form and leaked E_FAIL as a raw HRESULT for the fixed form. Check for an existing array variant at the start of interp_dim's FUNC_GLOBAL branch and raise VBSE_TYPE_MISMATCH consistently. Re-Dim'ing a previously scalar Dim continues to work. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10928
From: Francis De Brabandere <francisdb@gmail.com> ExecuteGlobal compiles a fresh script that shares the host's script-global scope. If a name was previously Dim'd as an array (dynamic or fixed), a subsequent ExecuteGlobal that Dim's the same name raises err 13 on native. Re-Dim'ing a previously scalar Dim is allowed. Mark the failing cases todo_wine for the upcoming interp_dim fix. --- dlls/vbscript/tests/lang.vbs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index d8d612bd389..c2b05332b90 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -2799,6 +2799,41 @@ sub TestRedimInputArg end sub Call TestRedimInputArg +sub TestExecuteGlobalRedim + on error resume next + + ' Dim arr() already declared as a dynamic array in a prior compile unit. + err.clear : ExecuteGlobal "Dim egDynArr()" + call ok(err.number = 0, "first Dim egDynArr() err=" & err.number) + + err.clear : ExecuteGlobal "Dim egDynArr()" + todo_wine_ok err.number = 13, "second Dim egDynArr() err=" & err.number + + err.clear : ExecuteGlobal "Dim egDynArr() : ReDim egDynArr(5)" + todo_wine_ok err.number = 13, "Dim+ReDim egDynArr() err=" & err.number + + ' Dim arr(N) already declared as a fixed array in a prior compile unit. + err.clear : ExecuteGlobal "Dim egFixArr(2)" + call ok(err.number = 0, "first Dim egFixArr(2) err=" & err.number) + + err.clear : ExecuteGlobal "Dim egFixArr(2)" + todo_wine_ok err.number = 13, "second Dim egFixArr(2) err=" & err.number + + err.clear : ExecuteGlobal "Dim egFixArr()" + todo_wine_ok err.number = 13, "second Dim egFixArr() err=" & err.number + + ' Re-Dim'ing a previously scalar Dim is allowed. + err.clear : ExecuteGlobal "Dim egScalar" + call ok(err.number = 0, "first Dim egScalar err=" & err.number) + + err.clear : ExecuteGlobal "Dim egScalar" + call ok(err.number = 0, "second Dim egScalar (scalar) err=" & err.number) + + err.clear : ExecuteGlobal "Dim egScalar()" + call ok(err.number = 0, "second Dim egScalar() (array) err=" & err.number) +end sub +Call TestExecuteGlobalRedim + sub TestReDimList dim x, y -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10928
From: Francis De Brabandere <francisdb@gmail.com> A separate ExecuteGlobal can re-encounter a name that was already Dim'd as an array (dynamic or fixed) in an earlier compile unit. Native raises err 13 (Type mismatch) for this case. Wine silently accepted the dynamic form and leaked E_FAIL as a raw HRESULT for the fixed form. Check for an existing array variant at the start of interp_dim's FUNC_GLOBAL branch and raise VBSE_TYPE_MISMATCH consistently. Re-Dim'ing a previously scalar Dim continues to work. --- dlls/vbscript/interp.c | 7 +++++++ dlls/vbscript/tests/lang.vbs | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index ac2bbc64ce6..eb96e73b272 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -1411,6 +1411,13 @@ static HRESULT interp_dim(exec_ctx_t *ctx) assert(var != NULL); v = &var->v; array_ref = &var->array; + + /* A separate ExecuteGlobal can re-encounter a name that was already + * Dim'd as an array in an earlier compile unit. Native rejects this + * with err 13 regardless of whether the existing array is fixed or + * dynamic. Re-Dim'ing an existing scalar (V_VT_EMPTY) is allowed. */ + if(V_ISARRAY(v)) + return MAKE_VBSERROR(VBSE_TYPE_MISMATCH); }else { ref_t ref; diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index c2b05332b90..fe98dd857e1 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -2807,20 +2807,20 @@ sub TestExecuteGlobalRedim call ok(err.number = 0, "first Dim egDynArr() err=" & err.number) err.clear : ExecuteGlobal "Dim egDynArr()" - todo_wine_ok err.number = 13, "second Dim egDynArr() err=" & err.number + call ok(err.number = 13, "second Dim egDynArr() err=" & err.number) err.clear : ExecuteGlobal "Dim egDynArr() : ReDim egDynArr(5)" - todo_wine_ok err.number = 13, "Dim+ReDim egDynArr() err=" & err.number + call ok(err.number = 13, "Dim+ReDim egDynArr() err=" & err.number) ' Dim arr(N) already declared as a fixed array in a prior compile unit. err.clear : ExecuteGlobal "Dim egFixArr(2)" call ok(err.number = 0, "first Dim egFixArr(2) err=" & err.number) err.clear : ExecuteGlobal "Dim egFixArr(2)" - todo_wine_ok err.number = 13, "second Dim egFixArr(2) err=" & err.number + call ok(err.number = 13, "second Dim egFixArr(2) err=" & err.number) err.clear : ExecuteGlobal "Dim egFixArr()" - todo_wine_ok err.number = 13, "second Dim egFixArr() err=" & err.number + call ok(err.number = 13, "second Dim egFixArr() err=" & err.number) ' Re-Dim'ing a previously scalar Dim is allowed. err.clear : ExecuteGlobal "Dim egScalar" -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10928
This merge request was approved by Jacek Caban. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10928
participants (3)
-
Francis De Brabandere -
Francis De Brabandere (@francisdb) -
Jacek Caban (@jacek)