php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #63588
Patch php-5.4.9-json.patch revision 2012-11-23 14:14 UTC by remi@php.net
Patch json.patch revision 2012-11-23 13:27 UTC by remi

Patch php-5.4.9-json.patch for json Bug #63588

Patch version 2012-11-23 14:14 UTC

Return to Bug #63588 | Download this patch
This patch renders other patches obsolete

Obsolete patches:

Patch Revisions:

Developer: remi@php.net

diff -up php-5.4.9/ext/json/config.m4.63588 php-5.4.9/ext/json/config.m4
--- php-5.4.9/ext/json/config.m4.63588	2012-11-23 14:48:42.934043358 +0100
+++ php-5.4.9/ext/json/config.m4	2012-11-23 14:48:58.237102616 +0100
@@ -9,7 +9,7 @@ if test "$PHP_JSON" != "no"; then
   AC_DEFINE([HAVE_JSON],1 ,[whether to enable JavaScript Object Serialization support])
   AC_HEADER_STDC
 
-  PHP_NEW_EXTENSION(json, json.c utf8_to_utf16.c utf8_decode.c JSON_parser.c, $ext_shared)
+  PHP_NEW_EXTENSION(json, json.c utf8_decode.c JSON_parser.c, $ext_shared)
   PHP_INSTALL_HEADERS([ext/json], [php_json.h])
   PHP_SUBST(JSON_SHARED_LIBADD)
 fi
diff -up php-5.4.9/ext/json/json.c.63588 php-5.4.9/ext/json/json.c
--- php-5.4.9/ext/json/json.c.63588	2012-11-23 14:48:28.038987099 +0100
+++ php-5.4.9/ext/json/json.c	2012-11-23 14:51:37.780705594 +0100
@@ -25,8 +25,8 @@
 #include "php.h"
 #include "php_ini.h"
 #include "ext/standard/info.h"
+#include "ext/standard/html.h"
 #include "ext/standard/php_smart_str.h"
-#include "utf8_to_utf16.h"
 #include "JSON_parser.h"
 #include "php_json.h"
 #include <zend_exceptions.h>
@@ -344,6 +344,32 @@ static void json_encode_array(smart_str
 }
 /* }}} */
 
+static int json_utf8_to_utf16(unsigned short *utf16, char utf8[], int len) /* {{{ */
+{
+	size_t pos = 0, us;
+	int j, status;
+
+	for (j=0 ; pos < len ; j++) {
+		us = php_next_utf8_char((const unsigned char *)utf8, len, &pos, &status);
+		if (status != SUCCESS) {
+			return -1;
+		}
+		if (utf16) {
+			/* From http://en.wikipedia.org/wiki/UTF16 */
+			if (us >= 0x10000) {
+				us -= 0x10000;
+				utf16[j++] = (unsigned short)((us >> 10) | 0xd800);
+				utf16[j] = (unsigned short)((us & 0x3ff) | 0xdc00);
+			} else {
+				utf16[j] = (unsigned short)us;
+			}
+		}
+	}
+	return j;
+}
+/* }}} */
+
+
 #define REVERSE16(us) (((us & 0xf) << 12) | (((us >> 4) & 0xf) << 8) | (((us >> 8) & 0xf) << 4) | ((us >> 12) & 0xf))
 
 static void json_escape_string(smart_str *buf, char *s, int len, int options TSRMLS_DC) /* {{{ */
@@ -383,7 +409,7 @@ static void json_escape_string(smart_str
 	}
 
 	utf16 = (options & PHP_JSON_UNESCAPED_UNICODE) ? NULL : (unsigned short *) safe_emalloc(len, sizeof(unsigned short), 0);
-	ulen = utf8_to_utf16(utf16, s, len);
+	ulen = json_utf8_to_utf16(utf16, s, len);
 	if (ulen <= 0) {
 		if (utf16) {
 			efree(utf16);
@@ -628,7 +654,7 @@ PHP_JSON_API void php_json_decode_ex(zva
 
 	utf16 = (unsigned short *) safe_emalloc((str_len+1), sizeof(unsigned short), 1);
 
-	utf16_len = utf8_to_utf16(utf16, str, str_len);
+	utf16_len = json_utf8_to_utf16(utf16, str, str_len);
 	if (utf16_len <= 0) {
 		if (utf16) {
 			efree(utf16);
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Mon Apr 21 10:02:10 2014 UTC