]> git.kaiwu.me - njs.git/commitdiff
Fixed null pointer passing for args declared to never be null.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 29 Aug 2019 12:12:44 +0000 (15:12 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 29 Aug 2019 12:12:44 +0000 (15:12 +0300)
Found by UndefinedBehaviorSanitizer.

src/njs_array.c
src/njs_generator.c
src/njs_sprintf.c
src/njs_string.c
src/njs_vm.c

index fce094720b168577af69c02126f2f0345297e9f4..31bcf6612e390a6f1ef6317b074b1284c592599c 100644 (file)
@@ -152,7 +152,9 @@ njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
     array->data = start;
     start += prepend;
 
-    memcpy(start, array->start, array->length * sizeof(njs_value_t));
+    if (array->length != 0) {
+        memcpy(start, array->start, array->length * sizeof(njs_value_t));
+    }
 
     array->start = start;
 
index dbefd02c57b7a16abe432936bd016c4e6bdfa110..b272bcbfeabca5f7587aa9c24ef417062a78c526 100644 (file)
@@ -1323,7 +1323,7 @@ njs_generate_find_block(njs_generator_block_t *block, uint32_t mask,
      * loop or switch statement.
      */
     if ((mask & NJS_GENERATOR_ALL) == NJS_GENERATOR_ALL
-        && !njs_strstr_eq(label, &no_label))
+        && label->length != 0)
     {
         mask |= NJS_GENERATOR_BLOCK;
     }
@@ -3376,9 +3376,13 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
 
     ref_err->token_line = node->token_line;
 
-    ret = njs_name_copy(vm, &ref_err->file, &node->scope->file);
-    if (njs_slow_path(ret != NJS_OK)) {
-        return NJS_ERROR;
+    ref_err->file.length = node->scope->file.length;
+
+    if (ref_err->file.length != 0) {
+        ret = njs_name_copy(vm, &ref_err->file, &node->scope->file);
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
+        }
     }
 
     return njs_name_copy(vm, &ref_err->name, &node->u.reference.name);
index 1f7358e888fe95e4327888c9d8aac70ba37556aa..9ae739665534403eb026f8bab4f2da27edeb0ac4 100644 (file)
@@ -86,7 +86,7 @@ njs_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
     u_char         *p;
     int            d;
     double         f, i;
-    size_t         length;
+    size_t         size, length;
     int64_t        i64;
     uint64_t       ui64, frac;
     njs_str_t      *v;
@@ -418,7 +418,12 @@ njs_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
 
     copy:
 
-        buf = njs_cpymem(buf, p, njs_min((size_t) (end - buf), length));
+        size = njs_min((size_t) (end - buf), length);
+
+        if (size != 0) {
+            buf = njs_cpymem(buf, p, size);
+        }
+
         continue;
     }
 
index 848710f53c39920c7c2ef97f0092b83666bd1354..1f1db2cc289f48aba26e83d9ece592514fa441ca 100644 (file)
@@ -3789,8 +3789,11 @@ njs_string_replace_join(njs_vm_t *vm, njs_string_replace_t *r)
     p = string;
 
     for (i = 0; i < n; i++) {
-        p = memcpy(p, part[i].start, part[i].size);
-        p += part[i].size;
+        size = part[i].size;
+
+        if (size != 0) {
+            p = njs_cpymem(p, part[i].start, size);
+        }
 
         /* GC: release valid values. */
     }
index 4261a4bfe6f0869b27c1168f7fe4e3fe31d015d0..5aef01741b69d5a19d37200b38d8cd4d149a102a 100644 (file)
@@ -347,8 +347,11 @@ njs_vm_init(njs_vm_t *vm)
     frame->native.free = values + scope_size;
 
     vm->scopes[NJS_SCOPE_GLOBAL] = (njs_value_t *) values;
-    memcpy(values + NJS_INDEX_GLOBAL_OFFSET, vm->global_scope,
-           vm->scope_size);
+
+    if (vm->global_scope != 0) {
+        memcpy(values + NJS_INDEX_GLOBAL_OFFSET, vm->global_scope,
+               vm->scope_size);
+    }
 
     ret = njs_regexp_init(vm);
     if (njs_slow_path(ret != NJS_OK)) {