mirror of
https://github.com/nodejs/node.git
synced 2025-05-05 19:08:17 +00:00
src: don't use NewExternal() with unaligned strings
V8 3.20.9 enforces that external pointers are aligned on a two-byte boundary. We cannot portably guarantee that for the source code strings that tools/js2c.py generates so simply stop using String::NewExternal() altogether (and by extension String::ExternalAsciiStringResource). Fixes the following run-time assert: FATAL ERROR: v8::String::NewExternal() Pointer is not aligned
This commit is contained in:
parent
1bd711c8a0
commit
34b0a36120
2
node.gyp
2
node.gyp
@ -101,7 +101,6 @@
|
|||||||
'src/node_os.cc',
|
'src/node_os.cc',
|
||||||
'src/node_script.cc',
|
'src/node_script.cc',
|
||||||
'src/node_stat_watcher.cc',
|
'src/node_stat_watcher.cc',
|
||||||
'src/node_string.cc',
|
|
||||||
'src/node_watchdog.cc',
|
'src/node_watchdog.cc',
|
||||||
'src/node_zlib.cc',
|
'src/node_zlib.cc',
|
||||||
'src/pipe_wrap.cc',
|
'src/pipe_wrap.cc',
|
||||||
@ -127,7 +126,6 @@
|
|||||||
'src/node_os.h',
|
'src/node_os.h',
|
||||||
'src/node_root_certs.h',
|
'src/node_root_certs.h',
|
||||||
'src/node_script.h',
|
'src/node_script.h',
|
||||||
'src/node_string.h',
|
|
||||||
'src/node_version.h',
|
'src/node_version.h',
|
||||||
'src/node_watchdog.h',
|
'src/node_watchdog.h',
|
||||||
'src/node_wrap.h',
|
'src/node_wrap.h',
|
||||||
|
@ -72,7 +72,6 @@ typedef int mode_t;
|
|||||||
#include "node_constants.h"
|
#include "node_constants.h"
|
||||||
#include "node_javascript.h"
|
#include "node_javascript.h"
|
||||||
#include "node_version.h"
|
#include "node_version.h"
|
||||||
#include "node_string.h"
|
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
# include "node_crypto.h"
|
# include "node_crypto.h"
|
||||||
#endif
|
#endif
|
||||||
@ -2403,6 +2402,8 @@ static void SignalExit(int signal) {
|
|||||||
|
|
||||||
|
|
||||||
void Load(Handle<Object> process_l) {
|
void Load(Handle<Object> process_l) {
|
||||||
|
HandleScope handle_scope(node_isolate);
|
||||||
|
|
||||||
process_symbol = String::New("process");
|
process_symbol = String::New("process");
|
||||||
domain_symbol = String::New("domain");
|
domain_symbol = String::New("domain");
|
||||||
|
|
||||||
@ -2420,8 +2421,7 @@ void Load(Handle<Object> process_l) {
|
|||||||
// are not safe to ignore.
|
// are not safe to ignore.
|
||||||
try_catch.SetVerbose(false);
|
try_catch.SetVerbose(false);
|
||||||
|
|
||||||
Local<Value> f_value = ExecuteString(MainSource(),
|
Local<Value> f_value = ExecuteString(MainSource(), String::New("node.js"));
|
||||||
IMMUTABLE_STRING("node.js"));
|
|
||||||
if (try_catch.HasCaught()) {
|
if (try_catch.HasCaught()) {
|
||||||
ReportException(try_catch);
|
ReportException(try_catch);
|
||||||
exit(10);
|
exit(10);
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include "v8.h"
|
#include "v8.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "node_natives.h"
|
#include "node_natives.h"
|
||||||
#include "node_string.h"
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if !defined(_MSC_VER)
|
#if !defined(_MSC_VER)
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
@ -33,7 +33,7 @@ using namespace v8;
|
|||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
Handle<String> MainSource() {
|
Handle<String> MainSource() {
|
||||||
return BUILTIN_ASCII_ARRAY(node_native, sizeof(node_native)-1);
|
return String::New(node_native, sizeof(node_native) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefineJavaScript(v8::Handle<v8::Object> target) {
|
void DefineJavaScript(v8::Handle<v8::Object> target) {
|
||||||
@ -42,7 +42,8 @@ void DefineJavaScript(v8::Handle<v8::Object> target) {
|
|||||||
for (int i = 0; natives[i].name; i++) {
|
for (int i = 0; natives[i].name; i++) {
|
||||||
if (natives[i].source != node_native) {
|
if (natives[i].source != node_native) {
|
||||||
Local<String> name = String::New(natives[i].name);
|
Local<String> name = String::New(natives[i].name);
|
||||||
Handle<String> source = BUILTIN_ASCII_ARRAY(natives[i].source, natives[i].source_len);
|
Handle<String> source = String::New(natives[i].source,
|
||||||
|
natives[i].source_len);
|
||||||
target->Set(name, source);
|
target->Set(name, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
// Copyright Joyent, Inc. and other Node contributors.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and associated documentation files (the
|
|
||||||
// "Software"), to deal in the Software without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
||||||
// persons to whom the Software is furnished to do so, subject to the
|
|
||||||
// following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included
|
|
||||||
// in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
||||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
#include "node_string.h"
|
|
||||||
|
|
||||||
namespace node {
|
|
||||||
|
|
||||||
using namespace v8;
|
|
||||||
|
|
||||||
extern Isolate* node_isolate;
|
|
||||||
|
|
||||||
Handle<String> ImmutableAsciiSource::CreateFromLiteral(
|
|
||||||
const char *string_literal,
|
|
||||||
size_t length) {
|
|
||||||
HandleScope scope(node_isolate);
|
|
||||||
|
|
||||||
Local<String> ret = String::NewExternal(new ImmutableAsciiSource(
|
|
||||||
string_literal,
|
|
||||||
length));
|
|
||||||
return scope.Close(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
// Copyright Joyent, Inc. and other Node contributors.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and associated documentation files (the
|
|
||||||
// "Software"), to deal in the Software without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
||||||
// persons to whom the Software is furnished to do so, subject to the
|
|
||||||
// following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included
|
|
||||||
// in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
||||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
#ifndef SRC_NODE_STRING_H_
|
|
||||||
#define SRC_NODE_STRING_H_
|
|
||||||
|
|
||||||
#include "v8.h"
|
|
||||||
|
|
||||||
namespace node {
|
|
||||||
|
|
||||||
#define IMMUTABLE_STRING(string_literal) \
|
|
||||||
::node::ImmutableAsciiSource::CreateFromLiteral( \
|
|
||||||
string_literal "", sizeof(string_literal) - 1)
|
|
||||||
#define BUILTIN_ASCII_ARRAY(array, len) \
|
|
||||||
::node::ImmutableAsciiSource::CreateFromLiteral(array, len)
|
|
||||||
|
|
||||||
class ImmutableAsciiSource : public v8::String::ExternalAsciiStringResource {
|
|
||||||
public:
|
|
||||||
static v8::Handle<v8::String> CreateFromLiteral(const char *string_literal,
|
|
||||||
size_t length);
|
|
||||||
|
|
||||||
ImmutableAsciiSource(const char *src, size_t src_len)
|
|
||||||
: buffer_(src),
|
|
||||||
buf_len_(src_len) {
|
|
||||||
}
|
|
||||||
|
|
||||||
~ImmutableAsciiSource() {
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *data() const {
|
|
||||||
return buffer_;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t length() const {
|
|
||||||
return buf_len_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const char *buffer_;
|
|
||||||
size_t buf_len_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace node
|
|
||||||
|
|
||||||
#endif // SRC_NODE_STRING_H_
|
|
Loading…
Reference in New Issue
Block a user