aboutsummaryrefslogtreecommitdiff
path: root/ext/misc/json1.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/misc/json1.c')
-rw-r--r--ext/misc/json1.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/ext/misc/json1.c b/ext/misc/json1.c
index 4945826b9..cd4531bcc 100644
--- a/ext/misc/json1.c
+++ b/ext/misc/json1.c
@@ -454,33 +454,29 @@ static void jsonReturn(
}
for(i=1, j=0; i<n-1; i++){
char c = z[i];
- if( c!='\\' && z[i+1] ){
+ if( c!='\\' ){
zOut[j++] = c;
}else{
c = z[++i];
- if( c=='u' && z[1] ){
+ if( c=='u' ){
u32 v = 0, k;
- for(k=0; k<4 && z[i+1]; i++, k++){
+ for(k=0; k<4 && i<n-2; i++, k++){
c = z[i+1];
if( c>='0' && c<='9' ) v = v*16 + c - '0';
else if( c>='A' && c<='F' ) v = v*16 + c - 'A' + 10;
else if( c>='a' && c<='f' ) v = v*16 + c - 'a' + 10;
else break;
}
+ if( v==0 ) break;
if( v<=0x7f ){
zOut[j++] = v;
}else if( v<=0x7ff ){
zOut[j++] = 0xc0 | (v>>6);
zOut[j++] = 0x80 | (v&0x3f);
- }else if( v<=0xffff ){
+ }else{
zOut[j++] = 0xe0 | (v>>12);
zOut[j++] = 0x80 | ((v>>6)&0x3f);
zOut[j++] = 0x80 | (v&0x3f);
- }else if( v<=0x10ffff ){
- zOut[j++] = 0xf0 | (v>>18);
- zOut[j++] = 0x80 | ((v>>12)&0x3f);
- zOut[j++] = 0x80 | ((v>>6)&0x3f);
- zOut[j++] = 0x80 | (v&0x3f);
}
}else{
if( c=='b' ){