Skip to content

Commit 91fdb85

Browse files
committed
* Check for ISO-8859-1/UTF-8 on strings to prevent binary data corruption
1 parent f696867 commit 91fdb85

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

Makefile.frag

+2
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ endif
1212
ifneq (,$(realpath $(EXTENSION_DIR)/dom.so))
1313
PHP_TEST_SHARED_EXTENSIONS+=-d extension=$(EXTENSION_DIR)/dom.so
1414
endif
15+
16+
PHP_TEST_SHARED_EXTENSIONS+=-d extension=$(EXTENSION_DIR)/mbstring.so

v8js_convert.cc

+28-5
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ v8::Local<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */
113113
v8::Local<v8::Value> jsValue;
114114
zend_string *value_str;
115115
zend_class_entry *ce;
116-
116+
117117
switch (Z_TYPE_P(value))
118118
{
119119
case IS_INDIRECT:
@@ -150,7 +150,20 @@ v8::Local<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */
150150
break;
151151
}
152152

153-
jsValue = V8JS_ZSTR(value_str);
153+
zval fname, retval;
154+
zval params[2];
155+
ZVAL_STRING(&fname, "mb_check_encoding");
156+
ZVAL_COPY_VALUE(&params[0], value);
157+
ZVAL_STRING(&params[1], "UTF-8");
158+
159+
if ((SUCCESS == call_user_function(CG(function_table), NULL, &fname,
160+
&retval, 2, params)) && (Z_TYPE(retval) == IS_TRUE)) {
161+
jsValue = V8JS_ZSTR(value_str);
162+
}
163+
else {
164+
jsValue = v8::String::NewFromOneByte(isolate, (unsigned char *)ZSTR_VAL(value_str), v8::NewStringType::kNormal, ZSTR_LEN(value_str)).ToLocalChecked();
165+
}
166+
154167
break;
155168

156169
case IS_LONG:
@@ -191,9 +204,19 @@ int v8js_to_zval(v8::Local<v8::Value> jsValue, zval *return_value, int flags, v8
191204

192205
if (jsValue->IsString())
193206
{
194-
v8::String::Utf8Value str(isolate, jsValue);
195-
const char *cstr = ToCString(str);
196-
RETVAL_STRINGL(cstr, str.length());
207+
v8::Local<v8::String> strOneByte = jsValue->ToString(v8_context).ToLocalChecked();
208+
if (strOneByte->IsOneByte() && strOneByte->ContainsOnlyOneByte()) {
209+
int length = strOneByte->Length();
210+
char* char_value = new char[length + 1];
211+
strOneByte->WriteOneByte(isolate, reinterpret_cast<uint8_t*>(&char_value[0]), 0, length);
212+
213+
RETVAL_STRINGL(char_value, length);
214+
}
215+
else {
216+
v8::String::Utf8Value str(isolate, jsValue);
217+
const char *cstr = ToCString(str);
218+
RETVAL_STRINGL(cstr, str.length());
219+
}
197220
}
198221
else if (jsValue->IsBoolean())
199222
{

0 commit comments

Comments
 (0)