Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
src: replace usage of String::Utf8Value
Browse files Browse the repository at this point in the history
v8::String::Utf8Value previously could allow invalid surrogates when
interpreting values.
  • Loading branch information
tjfontaine committed Jun 6, 2014
1 parent 066e978 commit 15f0e0a
Show file tree
Hide file tree
Showing 11 changed files with 166 additions and 69 deletions.
7 changes: 4 additions & 3 deletions src/cares_wrap.cc
Expand Up @@ -47,6 +47,7 @@
# define uv_inet_ntop inet_ntop
#endif

#include "util.h"

namespace node {

Expand Down Expand Up @@ -555,7 +556,7 @@ static Handle<Value> Query(const Arguments& args) {
// object reference, causing wrap->GetObject() to return undefined.
Local<Object> object = Local<Object>::New(wrap->GetObject());

String::Utf8Value name(args[0]);
node::Utf8Value name(args[0]);

int r = wrap->Send(*name);
if (r) {
Expand Down Expand Up @@ -584,7 +585,7 @@ static Handle<Value> QueryWithFamily(const Arguments& args) {
// object reference, causing wrap->GetObject() to return undefined.
Local<Object> object = Local<Object>::New(wrap->GetObject());

String::Utf8Value name(args[0]);
node::Utf8Value name(args[0]);
int family = args[1]->Int32Value();

int r = wrap->Send(*name, family);
Expand Down Expand Up @@ -706,7 +707,7 @@ static Handle<Value> IsIP(const Arguments& args) {
static Handle<Value> GetAddrInfo(const Arguments& args) {
HandleScope scope;

String::Utf8Value hostname(args[0]);
node::Utf8Value hostname(args[0]);

int fam = AF_UNSPEC;
if (args[1]->IsInt32()) {
Expand Down
3 changes: 2 additions & 1 deletion src/fs_event_wrap.cc
Expand Up @@ -21,6 +21,7 @@

#include "node.h"
#include "handle_wrap.h"
#include "util.h"

#include <stdlib.h>

Expand Down Expand Up @@ -97,7 +98,7 @@ Handle<Value> FSEventWrap::Start(const Arguments& args) {
return ThrowException(Exception::TypeError(String::New("Bad arguments")));
}

String::Utf8Value path(args[0]);
node::Utf8Value path(args[0]);

int r = uv_fs_event_init(uv_default_loop(), &wrap->handle_, *path, OnEvent, 0);
if (r == 0) {
Expand Down
42 changes: 22 additions & 20 deletions src/node.cc
Expand Up @@ -80,6 +80,8 @@ typedef int mode_t;
#include "node_script.h"
#include "v8_typed_array.h"

#include "util.h"

using namespace v8;

# ifdef __APPLE__
Expand Down Expand Up @@ -989,7 +991,7 @@ MakeCallback(const Handle<Object> object,

Local<Value> callback_v = object->Get(symbol);
if (!callback_v->IsFunction()) {
String::Utf8Value method(symbol);
node::Utf8Value method(symbol);
// XXX: If the object has a domain attached, handle it there?
// At least, would be good to get *some* sort of indication
// of how we got here, even if it's not catchable.
Expand Down Expand Up @@ -1082,7 +1084,7 @@ enum encoding ParseEncoding(Handle<Value> encoding_v, enum encoding _default) {

if (!encoding_v->IsString()) return _default;

String::Utf8Value encoding(encoding_v);
node::Utf8Value encoding(encoding_v);

if (strcasecmp(*encoding, "utf8") == 0) {
return UTF8;
Expand Down Expand Up @@ -1258,12 +1260,12 @@ void DisplayExceptionLine (TryCatch &try_catch) {

if (!message.IsEmpty()) {
// Print (filename):(line number): (message).
String::Utf8Value filename(message->GetScriptResourceName());
node::Utf8Value filename(message->GetScriptResourceName());
const char* filename_string = *filename;
int linenum = message->GetLineNumber();
fprintf(stderr, "%s:%i\n", filename_string, linenum);
// Print line of source code.
String::Utf8Value sourceline(message->GetSourceLine());
node::Utf8Value sourceline(message->GetSourceLine());
const char* sourceline_string = *sourceline;

// Because of how node modules work, all scripts are wrapped with a
Expand Down Expand Up @@ -1310,7 +1312,7 @@ static void ReportException(TryCatch &try_catch, bool show_line) {

if (show_line) DisplayExceptionLine(try_catch);

String::Utf8Value trace(try_catch.StackTrace());
node::Utf8Value trace(try_catch.StackTrace());

// range errors have a trace member set to undefined
if (trace.length() > 0 && !try_catch.StackTrace()->IsUndefined()) {
Expand All @@ -1325,11 +1327,11 @@ static void ReportException(TryCatch &try_catch, bool show_line) {
!(er->ToObject()->Get(String::New("name"))->IsUndefined());

if (isErrorObject) {
String::Utf8Value name(er->ToObject()->Get(String::New("name")));
node::Utf8Value name(er->ToObject()->Get(String::New("name")));
fprintf(stderr, "%s: ", *name);
}

String::Utf8Value msg(!isErrorObject ? er
node::Utf8Value msg(!isErrorObject ? er
: er->ToObject()->Get(String::New("message")));
fprintf(stderr, "%s\n", *msg);
}
Expand Down Expand Up @@ -1411,7 +1413,7 @@ static Handle<Value> Chdir(const Arguments& args) {
return ThrowException(Exception::Error(String::New("Bad argument.")));
}

String::Utf8Value path(args[0]);
node::Utf8Value path(args[0]);

uv_err_t r = uv_chdir(*path);

Expand Down Expand Up @@ -1462,7 +1464,7 @@ static Handle<Value> Umask(const Arguments& args) {
oct = args[0]->Uint32Value();
} else {
oct = 0;
String::Utf8Value str(args[0]);
node::Utf8Value str(args[0]);

// Parse the octal string.
for (int i = 0; i < str.length(); i++) {
Expand Down Expand Up @@ -1511,7 +1513,7 @@ static Handle<Value> SetGid(const Arguments& args) {
if (args[0]->IsNumber()) {
gid = args[0]->Int32Value();
} else if (args[0]->IsString()) {
String::Utf8Value grpnam(args[0]);
node::Utf8Value grpnam(args[0]);
struct group grp, *grpp = NULL;
int err;

Expand Down Expand Up @@ -1552,7 +1554,7 @@ static Handle<Value> SetUid(const Arguments& args) {
if (args[0]->IsNumber()) {
uid = args[0]->Int32Value();
} else if (args[0]->IsString()) {
String::Utf8Value pwnam(args[0]);
node::Utf8Value pwnam(args[0]);
struct passwd pwd, *pwdp = NULL;
int err;

Expand Down Expand Up @@ -1760,7 +1762,7 @@ Handle<Value> DLOpen(const v8::Arguments& args) {
return ThrowException(exception);
}

String::Utf8Value filename(args[0]); // Cast
node::Utf8Value filename(args[0]); // Cast
Local<Object> target = args[1]->ToObject(); // Cast

if (uv_dlopen(*filename, &lib)) {
Expand All @@ -1772,7 +1774,7 @@ Handle<Value> DLOpen(const v8::Arguments& args) {
return ThrowException(Exception::Error(errmsg));
}

String::Utf8Value path(args[0]);
node::Utf8Value path(args[0]);
base = *path;

/* Find the shared library filename within the full path. */
Expand Down Expand Up @@ -1905,7 +1907,7 @@ static Handle<Value> Binding(const Arguments& args) {
HandleScope scope;

Local<String> module = args[0]->ToString();
String::Utf8Value module_v(module);
node::Utf8Value module_v(module);
node_module_struct* modp;

if (binding_cache.IsEmpty()) {
Expand Down Expand Up @@ -1969,7 +1971,7 @@ static void ProcessTitleSetter(Local<String> property,
Local<Value> value,
const AccessorInfo& info) {
HandleScope scope;
String::Utf8Value title(value);
node::Utf8Value title(value);
// TODO: protect with a lock
uv_set_process_title(*title);
}
Expand All @@ -1979,7 +1981,7 @@ static Handle<Value> EnvGetter(Local<String> property,
const AccessorInfo& info) {
HandleScope scope;
#ifdef __POSIX__
String::Utf8Value key(property);
node::Utf8Value key(property);
const char* val = getenv(*key);
if (val) {
return scope.Close(String::New(val));
Expand Down Expand Up @@ -2008,8 +2010,8 @@ static Handle<Value> EnvSetter(Local<String> property,
const AccessorInfo& info) {
HandleScope scope;
#ifdef __POSIX__
String::Utf8Value key(property);
String::Utf8Value val(value);
node::Utf8Value key(property);
node::Utf8Value val(value);
setenv(*key, *val, 1);
#else // _WIN32
String::Value key(property);
Expand All @@ -2029,7 +2031,7 @@ static Handle<Integer> EnvQuery(Local<String> property,
const AccessorInfo& info) {
HandleScope scope;
#ifdef __POSIX__
String::Utf8Value key(property);
node::Utf8Value key(property);
if (getenv(*key)) {
return scope.Close(Integer::New(None));
}
Expand Down Expand Up @@ -2057,7 +2059,7 @@ static Handle<Boolean> EnvDeleter(Local<String> property,
const AccessorInfo& info) {
HandleScope scope;
#ifdef __POSIX__
String::Utf8Value key(property);
node::Utf8Value key(property);
if (!getenv(*key)) return False();
unsetenv(*key); // can't check return value, it's void on some platforms
return True();
Expand Down
4 changes: 3 additions & 1 deletion src/node_buffer.cc
Expand Up @@ -34,6 +34,8 @@
# include <arpa/inet.h> // htons, htonl
#endif

#include "util.h"

#define MIN(a,b) ((a) < (b) ? (a) : (b))

#define BUFFER_CLASS_ID (0xBABE)
Expand Down Expand Up @@ -100,7 +102,7 @@ static size_t ByteLength (Handle<String> string, enum encoding enc) {
if (enc == UTF8) {
return string->Utf8Length();
} else if (enc == BASE64) {
String::Utf8Value v(string);
node::Utf8Value v(string);
return base64_decoded_size(*v, v.length());
} else if (enc == UCS2) {
return string->Length() * 2;
Expand Down
31 changes: 16 additions & 15 deletions src/node_crypto.cc
Expand Up @@ -26,6 +26,7 @@
#include "node.h"
#include "node_buffer.h"
#include "node_root_certs.h"
#include "util.h"

#include <string.h>
#ifdef _MSC_VER
Expand Down Expand Up @@ -181,7 +182,7 @@ Handle<Value> SecureContext::Init(const Arguments& args) {
OPENSSL_CONST SSL_METHOD *method = SSLv23_method();

if (args.Length() == 1 && args[0]->IsString()) {
String::Utf8Value sslmethod(args[0]);
node::Utf8Value sslmethod(args[0]);

if (strcmp(*sslmethod, "SSLv2_method") == 0) {
#ifndef OPENSSL_NO_SSL2
Expand Down Expand Up @@ -245,7 +246,7 @@ static BIO* LoadBIO (Handle<Value> v) {
int r = -1;

if (v->IsString()) {
String::Utf8Value s(v);
node::Utf8Value s(v);
r = BIO_write(bio, *s, s.length());
} else if (Buffer::HasInstance(v)) {
Local<Object> buffer_obj = v->ToObject();
Expand Down Expand Up @@ -298,7 +299,7 @@ Handle<Value> SecureContext::SetKey(const Arguments& args) {
BIO *bio = LoadBIO(args[0]);
if (!bio) return False();

String::Utf8Value passphrase(args[1]);
node::Utf8Value passphrase(args[1]);

EVP_PKEY* key = PEM_read_bio_PrivateKey(bio, NULL, NULL,
len == 1 ? NULL : *passphrase);
Expand Down Expand Up @@ -532,7 +533,7 @@ Handle<Value> SecureContext::SetCiphers(const Arguments& args) {
return ThrowException(Exception::TypeError(String::New("Bad parameter")));
}

String::Utf8Value ciphers(args[0]);
node::Utf8Value ciphers(args[0]);
SSL_CTX_set_cipher_list(sc->ctx_, *ciphers);

return True();
Expand Down Expand Up @@ -563,7 +564,7 @@ Handle<Value> SecureContext::SetSessionIdContext(const Arguments& args) {
return ThrowException(Exception::TypeError(String::New("Bad parameter")));
}

String::Utf8Value sessionIdContext(args[0]);
node::Utf8Value sessionIdContext(args[0]);
const unsigned char* sid_ctx = (const unsigned char*) *sessionIdContext;
unsigned int sid_ctx_len = sessionIdContext.length();

Expand Down Expand Up @@ -1023,7 +1024,7 @@ Handle<Value> Connection::New(const Arguments& args) {
if (is_server) {
SSL_CTX_set_tlsext_servername_callback(sc->ctx_, SelectSNIContextCallback_);
} else {
String::Utf8Value servername(args[2]);
node::Utf8Value servername(args[2]);
SSL_set_tlsext_host_name(p->ssl_, *servername);
}
#endif
Expand Down Expand Up @@ -2132,7 +2133,7 @@ class Cipher : public ObjectWrap {
ssize_t key_written = DecodeWrite(key_buf, key_buf_len, args[1], BINARY);
assert(key_written == key_buf_len);

String::Utf8Value cipherType(args[0]);
node::Utf8Value cipherType(args[0]);

bool r = cipher->CipherInit(*cipherType, key_buf, key_buf_len);

Expand Down Expand Up @@ -2186,7 +2187,7 @@ class Cipher : public ObjectWrap {
ssize_t iv_written = DecodeWrite(iv_buf, iv_len, args[2], BINARY);
assert(iv_written == iv_len);

String::Utf8Value cipherType(args[0]);
node::Utf8Value cipherType(args[0]);

bool r = cipher->CipherInitIv(*cipherType, key_buf,key_len,iv_buf,iv_len);

Expand Down Expand Up @@ -2548,7 +2549,7 @@ class Decipher : public ObjectWrap {
ssize_t key_written = DecodeWrite(key_buf, key_len, args[1], BINARY);
assert(key_written == key_len);

String::Utf8Value cipherType(args[0]);
node::Utf8Value cipherType(args[0]);

bool r = cipher->DecipherInit(*cipherType, key_buf,key_len);

Expand Down Expand Up @@ -2602,7 +2603,7 @@ class Decipher : public ObjectWrap {
ssize_t iv_written = DecodeWrite(iv_buf, iv_len, args[2], BINARY);
assert(iv_written == iv_len);

String::Utf8Value cipherType(args[0]);
node::Utf8Value cipherType(args[0]);

bool r = cipher->DecipherInitIv(*cipherType, key_buf,key_len,iv_buf,iv_len);

Expand Down Expand Up @@ -2900,7 +2901,7 @@ class Hmac : public ObjectWrap {
return ThrowException(exception);
}

String::Utf8Value hashType(args[0]);
node::Utf8Value hashType(args[0]);

bool r;

Expand Down Expand Up @@ -3060,7 +3061,7 @@ class Hash : public ObjectWrap {
"Must give hashtype string as argument")));
}

String::Utf8Value hashType(args[0]);
node::Utf8Value hashType(args[0]);

Hash *hash = new Hash();
if (!hash->HashInit(*hashType)) {
Expand Down Expand Up @@ -3253,7 +3254,7 @@ class Sign : public ObjectWrap {
"Must give signtype string as argument")));
}

String::Utf8Value signType(args[0]);
node::Utf8Value signType(args[0]);

bool r = sign->SignInit(*signType);

Expand Down Expand Up @@ -3506,7 +3507,7 @@ class Verify : public ObjectWrap {
"Must give verifytype string as argument")));
}

String::Utf8Value verifyType(args[0]);
node::Utf8Value verifyType(args[0]);

bool r = verify->VerifyInit(*verifyType);

Expand Down Expand Up @@ -3705,7 +3706,7 @@ class DiffieHellman : public ObjectWrap {
String::New("No group name given")));
}

String::Utf8Value group_name(args[0]);
node::Utf8Value group_name(args[0]);

modp_group* it = modp_groups;

Expand Down

0 comments on commit 15f0e0a

Please sign in to comment.