瀏覽代碼

Strip second timezone specification

v8 adds two timezone specifications to date strings.
However PHP fails to parse the second one, generated
on Windows systems.  Hence just strip away the redundant
specification and pass that one to PHP.
Stefan Siegl 10 年之前
父節點
當前提交
920d9eeb33
共有 1 個文件被更改,包括 25 次插入2 次删除
  1. 25 2
      v8js_convert.cc

+ 25 - 2
v8js_convert.cc

@@ -1149,12 +1149,32 @@ int v8js_to_zval(v8::Handle<v8::Value> jsValue, zval *return_value, int flags, v
 	{
 	{
 		v8::String::Utf8Value str(jsValue);
 		v8::String::Utf8Value str(jsValue);
 		const char *cstr = ToCString(str);
 		const char *cstr = ToCString(str);
+
+		/* cstr has two timezone specifications:
+		 *
+		 * example from Linux:
+		 * Mon Sep 08 1975 09:00:00 GMT+0000 (UTC)
+		 *
+		 * example from Windows:
+		 * Mon Sep 08 1975 11:00:00 GMT+0200 (W. Europe Daylight Time)
+		 *
+		 * ... problem is, that PHP can't parse the second timezone
+		 * specification as returned by v8 running on Windows.  And as a
+		 * matter of that fails due to inconsistent second timezone spec
+		 */
+		char *date_str = estrdup(cstr);
+		char *paren_ptr = strchr(date_str, '(');
+
+		if (paren_ptr != NULL) {
+			*paren_ptr = 0;
+		}
+
 		zend_class_entry *ce = php_date_get_date_ce();
 		zend_class_entry *ce = php_date_get_date_ce();
 #if PHP_VERSION_ID < 50304
 #if PHP_VERSION_ID < 50304
 		zval *param;
 		zval *param;
 
 
 		MAKE_STD_ZVAL(param);
 		MAKE_STD_ZVAL(param);
-		ZVAL_STRING(param, cstr, 1);
+		ZVAL_STRING(param, date_str, 0);
 
 
 		object_init_ex(return_value, ce TSRMLS_CC);
 		object_init_ex(return_value, ce TSRMLS_CC);
 		zend_call_method_with_1_params(&return_value, ce, &ce->constructor, "__construct", NULL, param);
 		zend_call_method_with_1_params(&return_value, ce, &ce->constructor, "__construct", NULL, param);
@@ -1165,9 +1185,12 @@ int v8js_to_zval(v8::Handle<v8::Value> jsValue, zval *return_value, int flags, v
 		}
 		}
 #else
 #else
 		php_date_instantiate(ce, return_value TSRMLS_CC);
 		php_date_instantiate(ce, return_value TSRMLS_CC);
-		if (!php_date_initialize((php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC), (char *) cstr, strlen(cstr), NULL, NULL, 0 TSRMLS_CC)) {
+		if (!php_date_initialize((php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC), date_str, strlen(date_str), NULL, NULL, 0 TSRMLS_CC)) {
+			efree(date_str);
 			return FAILURE;
 			return FAILURE;
 		}
 		}
+
+		efree(date_str);
 #endif
 #endif
 	}
 	}
 	else if (jsValue->IsObject())
 	else if (jsValue->IsObject())