[1/4] jscript: Properly handle \0 characters in Array join method.

Sebastian Lackner sebastian at fds-team.de
Sun Sep 11 11:46:41 CDT 2016


Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
 dlls/jscript/array.c      |   17 +++++++++--------
 dlls/jscript/tests/api.js |    5 +++++
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 66655f5..eda49cb 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -238,7 +238,8 @@ static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
     return S_OK;
 }
 
-static HRESULT array_join(script_ctx_t *ctx, jsdisp_t *array, DWORD length, const WCHAR *sep, jsval_t *r)
+static HRESULT array_join(script_ctx_t *ctx, jsdisp_t *array, DWORD length, const WCHAR *sep,
+        unsigned seplen, jsval_t *r)
 {
     jsstr_t **str_tab, *ret = NULL;
     jsval_t val;
@@ -272,9 +273,7 @@ static HRESULT array_join(script_ctx_t *ctx, jsdisp_t *array, DWORD length, cons
     }
 
     if(SUCCEEDED(hres)) {
-        DWORD seplen = 0, len = 0;
-
-        seplen = strlenW(sep);
+        DWORD len = 0;
 
         if(str_tab[0])
             len = jsstr_length(str_tab[0]);
@@ -350,11 +349,11 @@ static HRESULT Array_join(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne
         if(FAILED(hres))
             return hres;
 
-        hres = array_join(ctx, jsthis, length, sep, r);
+        hres = array_join(ctx, jsthis, length, sep, jsstr_length(sep_str), r);
 
         jsstr_release(sep_str);
     }else {
-        hres = array_join(ctx, jsthis, length, default_separatorW, r);
+        hres = array_join(ctx, jsthis, length, default_separatorW, strlenW(default_separatorW), r);
     }
 
     return hres;
@@ -935,7 +934,8 @@ static HRESULT Array_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
     if(!array)
         return throw_type_error(ctx, JS_E_ARRAY_EXPECTED, NULL);
 
-    return array_join(ctx, &array->dispex, array->length, default_separatorW, r);
+    return array_join(ctx, &array->dispex, array->length, default_separatorW,
+                      strlenW(default_separatorW), r);
 }
 
 static HRESULT Array_toLocaleString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
@@ -1011,7 +1011,8 @@ static HRESULT Array_get_value(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
     TRACE("\n");
 
-    return array_join(ctx, &array->dispex, array->length, default_separatorW, r);
+    return array_join(ctx, &array->dispex, array->length, default_separatorW,
+                      strlenW(default_separatorW), r);
 }
 
 static void Array_destructor(jsdisp_t *dispex)
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 083da93..b365f3f 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -933,6 +933,11 @@ ok(tmp === "1,2,,false,,,a", "arr.toString() = " + tmp);
 tmp = arr.toString("test");
 ok(tmp === "1,2,,false,,,a", "arr.toString() = " + tmp);
 
+arr = ["a", "b"];
+
+tmp = arr.join(String.fromCharCode(0));
+ok(tmp === "a" + String.fromCharCode(0) + "b", "arr.join(String.fromCharCode(0)) = " + tmp);
+
 arr = new Object();
 arr.length = 3;
 arr[0] = "aa";
-- 
2.9.0



More information about the wine-patches mailing list