view src/core/ngx_murmurhash.c @ 9278:f53146df9a47

Fixed Valgrind complaints about uninitialized values. In ngx_http_source_charset(), name->data was left uninitialized, and only name->len was set. Since it is used in debug logging, this resulted in the following complaints from Valgrind on systems with musl libc: ==42== Conditional jump or move depends on uninitialised value(s) ==42== at 0x12BC66: memcpy (string.h:51) ==42== by 0x12BC66: ngx_sprintf_str (ngx_string.c:586) ==42== by 0x12C03C: ngx_vslprintf (ngx_string.c:255) ==42== by 0x127694: ngx_log_error_core (ngx_log.c:135) ==42== by 0x1B8795: ngx_http_charset_header_filter (ngx_http_charset_filter_module.c:252) Similarly, ngx_http_split_args() returned uninitialized arg->data, which was then copied to r->args, and also used in debug logging: ==42== Conditional jump or move depends on uninitialised value(s) ==42== at 0x12BC10: memcpy (string.h:50) ==42== by 0x12BC10: ngx_sprintf_str (ngx_string.c:586) ==42== by 0x12C03C: ngx_vslprintf (ngx_string.c:255) ==42== by 0x127694: ngx_log_error_core (ngx_log.c:135) ==42== by 0x184EFB: ngx_http_internal_redirect (ngx_http_core_module.c:2526) ==42== by 0x1D8CCC: ngx_http_try_files_handler (ngx_http_try_files_module.c:209) Fix is to initialize data to NULL. Note that, while memcpy(p, NULL, 0) is also formally undefined now, it is used in multiple places in the code, and expected to be allowed in C2y (see WG14 proposals N3177, N3261, "Allow zero length operations on null pointers"). Prodded by Valgrind.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 31 May 2024 04:38:09 +0300
parents f38647c651a8
children
line wrap: on
line source


/*
 * Copyright (C) Austin Appleby
 */


#include <ngx_config.h>
#include <ngx_core.h>


uint32_t
ngx_murmur_hash2(u_char *data, size_t len)
{
    uint32_t  h, k;

    h = 0 ^ len;

    while (len >= 4) {
        k  = data[0];
        k |= data[1] << 8;
        k |= data[2] << 16;
        k |= data[3] << 24;

        k *= 0x5bd1e995;
        k ^= k >> 24;
        k *= 0x5bd1e995;

        h *= 0x5bd1e995;
        h ^= k;

        data += 4;
        len -= 4;
    }

    switch (len) {
    case 3:
        h ^= data[2] << 16;
        /* fall through */
    case 2:
        h ^= data[1] << 8;
        /* fall through */
    case 1:
        h ^= data[0];
        h *= 0x5bd1e995;
    }

    h ^= h >> 13;
    h *= 0x5bd1e995;
    h ^= h >> 15;

    return h;
}