diff --git a/dom/src/threads/nsDOMWorker.cpp b/dom/src/threads/nsDOMWorker.cpp index 4807a3ce95e..a06e915de54 100644 --- a/dom/src/threads/nsDOMWorker.cpp +++ b/dom/src/threads/nsDOMWorker.cpp @@ -373,13 +373,19 @@ nsDOMWorkerFunctions::AtoB(JSContext* aCx, return JS_FALSE; } - // We want the bytes here, not the jschars. - const char* bytes = JS_GetStringBytesZ(aCx, str); - if (!bytes) { - return JS_FALSE; - } + size_t len = JS_GetStringEncodingLength(aCx, str); + if (len == size_t(-1)) + return JS_FALSE; - nsDependentCString string(bytes, JS_GetStringLength(str)); + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString string(buffer, len); nsCAutoString result; if (NS_FAILED(nsXPConnect::Base64Decode(string, result))) { @@ -419,13 +425,19 @@ nsDOMWorkerFunctions::BtoA(JSContext* aCx, return JS_FALSE; } - // We want the bytes here, not the jschars. - const char* bytes = JS_GetStringBytesZ(aCx, str); - if (!bytes) { - return JS_FALSE; - } + size_t len = JS_GetStringEncodingLength(aCx, str); + if (len == size_t(-1)) + return JS_FALSE; - nsDependentCString string(bytes, JS_GetStringLength(str)); + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString string(buffer, len); nsCAutoString result; if (NS_FAILED(nsXPConnect::Base64Encode(string, result))) { diff --git a/js/src/xpconnect/loader/mozJSComponentLoader.cpp b/js/src/xpconnect/loader/mozJSComponentLoader.cpp index efae9bd7f24..b4646afc355 100644 --- a/js/src/xpconnect/loader/mozJSComponentLoader.cpp +++ b/js/src/xpconnect/loader/mozJSComponentLoader.cpp @@ -225,11 +225,19 @@ Atob(JSContext *cx, uintN argc, jsval *vp) if (!str) return JS_FALSE; - const char* bytes = JS_GetStringBytesZ(cx, str); - if (!bytes) + size_t len = JS_GetStringEncodingLength(cx, str); + if (len == size_t(-1)) return JS_FALSE; - nsDependentCString string(bytes, JS_GetStringLength(str)); + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString string(buffer, JS_GetStringLength(str)); nsCAutoString result; if (NS_FAILED(nsXPConnect::Base64Decode(string, result))) { @@ -255,11 +263,19 @@ Btoa(JSContext *cx, uintN argc, jsval *vp) if (!str) return JS_FALSE; - const char* bytes = JS_GetStringBytesZ(cx, str); - if (!bytes) + size_t len = JS_GetStringEncodingLength(cx, str); + if (len == size_t(-1)) return JS_FALSE; - nsDependentCString data(bytes, JS_GetStringLength(str)); + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString data(buffer, len); nsCAutoString result; if (NS_FAILED(nsXPConnect::Base64Encode(data, result))) {