Browse Source

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
v0.11.5-release
Ben Noordhuis 11 years ago
parent
commit
34b0a36120
  1. 2
      node.gyp
  2. 6
      src/node.cc
  3. 7
      src/node_javascript.cc
  4. 41
      src/node_string.cc
  5. 63
      src/node_string.h

2
node.gyp

@ -101,7 +101,6 @@
'src/node_os.cc',
'src/node_script.cc',
'src/node_stat_watcher.cc',
'src/node_string.cc',
'src/node_watchdog.cc',
'src/node_zlib.cc',
'src/pipe_wrap.cc',
@ -127,7 +126,6 @@
'src/node_os.h',
'src/node_root_certs.h',
'src/node_script.h',
'src/node_string.h',
'src/node_version.h',
'src/node_watchdog.h',
'src/node_wrap.h',

6
src/node.cc

@ -72,7 +72,6 @@ typedef int mode_t;
#include "node_constants.h"
#include "node_javascript.h"
#include "node_version.h"
#include "node_string.h"
#if HAVE_OPENSSL
# include "node_crypto.h"
#endif
@ -2403,6 +2402,8 @@ static void SignalExit(int signal) {
void Load(Handle<Object> process_l) {
HandleScope handle_scope(node_isolate);
process_symbol = String::New("process");
domain_symbol = String::New("domain");
@ -2420,8 +2421,7 @@ void Load(Handle<Object> process_l) {
// are not safe to ignore.
try_catch.SetVerbose(false);
Local<Value> f_value = ExecuteString(MainSource(),
IMMUTABLE_STRING("node.js"));
Local<Value> f_value = ExecuteString(MainSource(), String::New("node.js"));
if (try_catch.HasCaught()) {
ReportException(try_catch);
exit(10);

7
src/node_javascript.cc

@ -22,7 +22,7 @@
#include "v8.h"
#include "node.h"
#include "node_natives.h"
#include "node_string.h"
#include <string.h>
#if !defined(_MSC_VER)
#include <strings.h>
@ -33,7 +33,7 @@ using namespace v8;
namespace node {
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) {
@ -42,7 +42,8 @@ void DefineJavaScript(v8::Handle<v8::Object> target) {
for (int i = 0; natives[i].name; i++) {
if (natives[i].source != node_native) {
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);
}
}

41
src/node_string.cc

@ -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);
}
}

63
src/node_string.h

@ -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…
Cancel
Save