]> git.kaiwu.me - njs.git/commitdiff
Avoiding arithmetic operations with NULL pointer in TextDecoder().
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 9 Jan 2024 06:20:19 +0000 (22:20 -0800)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 9 Jan 2024 06:20:19 +0000 (22:20 -0800)
Found by UndefinedBehaviorSanitizer.

src/njs_encoding.c
src/njs_utf8.c

index 649adf70df7df17873b6c9a71f51092f8f896a19..98a733383dbd06614cb79a8aa4f3f921b52facff 100644 (file)
@@ -543,7 +543,7 @@ njs_text_decoder_decode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     /* Looking for BOM. */
 
-    if (!data->ignore_bom) {
+    if (start != NULL && !data->ignore_bom) {
         start += njs_utf8_bom(start, end);
     }
 
index bce8be84b6255b1f567552f47c975e504ede2abc..980a4497ecdf5aeb7308416a54c5ae5e9aeb6650 100644 (file)
@@ -361,25 +361,27 @@ njs_utf8_stream_length(njs_unicode_decode_t *ctx, const u_char *p, size_t len,
     size = 0;
     length = 0;
 
-    end = p + len;
+    if (p != NULL) {
+        end = p + len;
 
-    while (p < end) {
-        codepoint = njs_utf8_decode(ctx, &p, end);
+        while (p < end) {
+            codepoint = njs_utf8_decode(ctx, &p, end);
 
-        if (codepoint > NJS_UNICODE_MAX_CODEPOINT) {
-            if (codepoint == NJS_UNICODE_CONTINUE) {
-                break;
-            }
+            if (codepoint > NJS_UNICODE_MAX_CODEPOINT) {
+                if (codepoint == NJS_UNICODE_CONTINUE) {
+                    break;
+                }
 
-            if (fatal) {
-                return -1;
+                if (fatal) {
+                    return -1;
+                }
+
+                codepoint = NJS_UNICODE_REPLACEMENT;
             }
 
-            codepoint = NJS_UNICODE_REPLACEMENT;
+            size += njs_utf8_size(codepoint);
+            length++;
         }
-
-        size += njs_utf8_size(codepoint);
-        length++;
     }
 
     if (last && ctx->need != 0x00) {