1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Valentin V. Bartenev
5 * Copyright (C) NGINX, Inc.
6 */
7
8#include <nxt_main.h>

--- 1636 unchanged lines hidden (view full) ---

1645 for (i = 0; i < 4; i++) {
1646 utf = (utf << 4) | (p[i] >= 'A' ? 10 + ((p[i] & ~0x20) - 'A')
1647 : p[i] - '0');
1648 }
1649
1650 p += 4;
1651
1652 if (utf_high != 0) {
1653 if (nxt_slow_path(utf < 0xdc00 || utf > 0xdfff)) {
1653 if (nxt_slow_path(utf < 0xDC00 || utf > 0xDFFF)) {
1654
1655 nxt_conf_json_parse_error(error, p - 12,
1656 "Invalid JSON encoding sequence. This 12-byte "
1657 "sequence composes an illegal UTF-16 surrogate pair."
1658 );
1659
1660 return NULL;
1661 }
1662
1663 utf = ((utf_high - 0xd800) << 10) + (utf - 0xdc00) + 0x10000;
1663 utf = ((utf_high - 0xD800) << 10) + (utf - 0xDC00) + 0x10000;
1664
1665 break;
1666 }
1667
1668 if (utf < 0xd800 || utf > 0xdfff) {
1668 if (utf < 0xD800 || utf > 0xDFFF) {
1669 break;
1670 }
1671
1672 if (utf > 0xdbff || p[0] != '\\' || p[1] != 'u') {
1672 if (utf > 0xDBFF || p[0] != '\\' || p[1] != 'u') {
1673
1674 nxt_conf_json_parse_error(error, p - 6,
1675 "Invalid JSON encoding sequence. This 6-byte sequence "
1676 "does not represent a valid UTF character."
1677 );
1678
1679 return NULL;
1680 }

--- 536 unchanged lines hidden (view full) ---

2217 len = size;
2218
2219 while (size) {
2220 ch = *p++;
2221
2222 if (ch == '\\' || ch == '"') {
2223 len++;
2224
2225 } else if (ch <= 0x1f) {
2225 } else if (ch <= 0x1F) {
2226
2227 switch (ch) {
2228 case '\n':
2229 case '\r':
2230 case '\t':
2231 case '\b':
2232 case '\f':
2233 len++;

--- 14 unchanged lines hidden (view full) ---

2248static u_char *
2249nxt_conf_json_escape(u_char *dst, u_char *src, size_t size)
2250{
2251 u_char ch;
2252
2253 while (size) {
2254 ch = *src++;
2255
2256 if (ch > 0x1f) {
2256 if (ch > 0x1F) {
2257
2258 if (ch == '\\' || ch == '"') {
2259 *dst++ = '\\';
2260 }
2261
2262 *dst++ = ch;
2263
2264 } else {

--- 19 unchanged lines hidden (view full) ---

2284 case '\f':
2285 *dst++ = 'f';
2286 break;
2287
2288 default:
2289 *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';
2290 *dst++ = '0' + (ch >> 4);
2291
2292 ch &= 0xf;
2292 ch &= 0xF;
2293
2294 *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);
2295 }
2296 }
2297
2298 size--;
2299 }
2300

--- 31 unchanged lines hidden ---