details: https://hg.nginx.org/njs/rev/721475693b80 branches: changeset: 2252:721475693b80 user: Dmitry Volyntsev <xei...@nginx.com> date: Mon Jan 08 16:40:42 2024 -0800 description: Unifying hash function prototypes.
This fixes UndefinedBehaviorSanitizer warning "call to function through pointer to incorrect function type". Found by UndefinedBehaviorSanitizer. diffstat: external/njs_crypto_module.c | 71 +++++++++++++++++-------------------------- src/njs_hash.h | 32 +++++++++++++++++++ src/njs_main.h | 4 +- src/njs_md5.c | 10 +++--- src/njs_md5.h | 23 -------------- src/njs_sha1.c | 10 +++--- src/njs_sha1.h | 24 -------------- src/njs_sha2.c | 10 +++--- src/njs_sha2.h | 24 -------------- 9 files changed, 77 insertions(+), 131 deletions(-) diffs (424 lines): diff -r 57071ecadeb5 -r 721475693b80 external/njs_crypto_module.c --- a/external/njs_crypto_module.c Mon Jan 08 16:40:27 2024 -0800 +++ b/external/njs_crypto_module.c Mon Jan 08 16:40:42 2024 -0800 @@ -6,16 +6,14 @@ #include <njs.h> -#include <njs_md5.h> -#include <njs_sha1.h> -#include <njs_sha2.h> +#include <njs_hash.h> #include <njs_string.h> #include <njs_buffer.h> -typedef void (*njs_hash_init)(void *ctx); -typedef void (*njs_hash_update)(void *ctx, const void *data, size_t size); -typedef void (*njs_hash_final)(u_char *result, void *ctx); +typedef void (*njs_hash_init)(njs_hash_t *ctx); +typedef void (*njs_hash_update)(njs_hash_t *ctx, const void *data, size_t size); +typedef void (*njs_hash_final)(u_char result[32], njs_hash_t *ctx); typedef njs_int_t (*njs_digest_encode)(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src); @@ -31,24 +29,13 @@ typedef struct { } njs_hash_alg_t; typedef struct { - union { - njs_md5_t md5; - njs_sha1_t sha1; - njs_sha2_t sha2; - } u; - + njs_hash_t ctx; njs_hash_alg_t *alg; } njs_digest_t; typedef struct { u_char opad[64]; - - union { - njs_md5_t md5; - njs_sha1_t sha1; - njs_sha2_t sha2; - } u; - + njs_hash_t ctx; njs_hash_alg_t *alg; } njs_hmac_t; @@ -85,25 +72,25 @@ static njs_hash_alg_t njs_hash_algorithm { njs_str("md5"), 16, - (njs_hash_init) njs_md5_init, - (njs_hash_update) njs_md5_update, - (njs_hash_final) njs_md5_final + njs_md5_init, + njs_md5_update, + njs_md5_final }, { njs_str("sha1"), 20, - (njs_hash_init) njs_sha1_init, - (njs_hash_update) njs_sha1_update, - (njs_hash_final) njs_sha1_final + njs_sha1_init, + njs_sha1_update, + njs_sha1_final }, { njs_str("sha256"), 32, - (njs_hash_init) njs_sha2_init, - (njs_hash_update) njs_sha2_update, - (njs_hash_final) njs_sha2_final + njs_sha2_init, + njs_sha2_update, + njs_sha2_final }, { @@ -312,7 +299,7 @@ njs_crypto_create_hash(njs_vm_t *vm, njs dgst->alg = alg; - alg->init(&dgst->u); + alg->init(&dgst->ctx); return njs_vm_external_create(vm, retval, njs_crypto_hash_proto_id, dgst, 0); @@ -390,10 +377,10 @@ njs_hash_prototype_update(njs_vm_t *vm, } if (!hmac) { - dgst->alg->update(&dgst->u, data.start, data.length); + dgst->alg->update(&dgst->ctx, data.start, data.length); } else { - ctx->alg->update(&ctx->u, data.start, data.length); + ctx->alg->update(&ctx->ctx, data.start, data.length); } njs_value_assign(retval, this); @@ -450,17 +437,17 @@ njs_hash_prototype_digest(njs_vm_t *vm, if (!hmac) { alg = dgst->alg; - alg->final(digest, &dgst->u); + alg->final(digest, &dgst->ctx); dgst->alg = NULL; } else { alg = ctx->alg; - alg->final(hash1, &ctx->u); + alg->final(hash1, &ctx->ctx); - alg->init(&ctx->u); - alg->update(&ctx->u, ctx->opad, 64); - alg->update(&ctx->u, hash1, alg->size); - alg->final(digest, &ctx->u); + alg->init(&ctx->ctx); + alg->update(&ctx->ctx, ctx->opad, 64); + alg->update(&ctx->ctx, hash1, alg->size); + alg->final(digest, &ctx->ctx); ctx->alg = NULL; } @@ -562,9 +549,9 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs ctx->alg = alg; if (key.length > sizeof(key_buf)) { - alg->init(&ctx->u); - alg->update(&ctx->u, key.start, key.length); - alg->final(digest, &ctx->u); + alg->init(&ctx->ctx); + alg->update(&ctx->ctx, key.start, key.length); + alg->final(digest, &ctx->ctx); memcpy(key_buf, digest, alg->size); njs_explicit_memzero(key_buf + alg->size, sizeof(key_buf) - alg->size); @@ -583,8 +570,8 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs key_buf[i] ^= 0x36; } - alg->init(&ctx->u); - alg->update(&ctx->u, key_buf, 64); + alg->init(&ctx->ctx); + alg->update(&ctx->ctx, key_buf, 64); return njs_vm_external_create(vm, retval, njs_crypto_hmac_proto_id, ctx, 0); diff -r 57071ecadeb5 -r 721475693b80 src/njs_hash.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/njs_hash.h Mon Jan 08 16:40:42 2024 -0800 @@ -0,0 +1,32 @@ + +/* + * Copyright (C) Dmitry Volyntsev + * Copyright (C) NGINX, Inc. + */ + + +#ifndef _NJS_HASH_H_INCLUDED_ +#define _NJS_HASH_H_INCLUDED_ + + +typedef struct { + uint64_t bytes; + uint32_t a, b, c, d, e, f, g, h; + u_char buffer[64]; +} njs_hash_t; + + +NJS_EXPORT void njs_md5_init(njs_hash_t *ctx); +NJS_EXPORT void njs_md5_update(njs_hash_t *ctx, const void *data, size_t size); +NJS_EXPORT void njs_md5_final(u_char result[32], njs_hash_t *ctx); + +NJS_EXPORT void njs_sha1_init(njs_hash_t *ctx); +NJS_EXPORT void njs_sha1_update(njs_hash_t *ctx, const void *data, size_t size); +NJS_EXPORT void njs_sha1_final(u_char result[32], njs_hash_t *ctx); + +NJS_EXPORT void njs_sha2_init(njs_hash_t *ctx); +NJS_EXPORT void njs_sha2_update(njs_hash_t *ctx, const void *data, size_t size); +NJS_EXPORT void njs_sha2_final(u_char result[32], njs_hash_t *ctx); + + +#endif /* _NJS_HASH_H_INCLUDED_ */ diff -r 57071ecadeb5 -r 721475693b80 src/njs_main.h --- a/src/njs_main.h Mon Jan 08 16:40:27 2024 -0800 +++ b/src/njs_main.h Mon Jan 08 16:40:42 2024 -0800 @@ -41,9 +41,7 @@ #include <njs_regex.h> -#include <njs_md5.h> -#include <njs_sha1.h> -#include <njs_sha2.h> +#include <njs_hash.h> #include <njs.h> #include <njs_value.h> diff -r 57071ecadeb5 -r 721475693b80 src/njs_md5.c --- a/src/njs_md5.c Mon Jan 08 16:40:27 2024 -0800 +++ b/src/njs_md5.c Mon Jan 08 16:40:42 2024 -0800 @@ -9,12 +9,12 @@ #include <njs_main.h> -static const u_char *njs_md5_body(njs_md5_t *ctx, const u_char *data, +static const u_char *njs_md5_body(njs_hash_t *ctx, const u_char *data, size_t size); void -njs_md5_init(njs_md5_t *ctx) +njs_md5_init(njs_hash_t *ctx) { ctx->a = 0x67452301; ctx->b = 0xefcdab89; @@ -26,7 +26,7 @@ njs_md5_init(njs_md5_t *ctx) void -njs_md5_update(njs_md5_t *ctx, const void *data, size_t size) +njs_md5_update(njs_hash_t *ctx, const void *data, size_t size) { size_t used, free; @@ -57,7 +57,7 @@ njs_md5_update(njs_md5_t *ctx, const voi void -njs_md5_final(u_char result[16], njs_md5_t *ctx) +njs_md5_final(u_char result[32], njs_hash_t *ctx) { size_t used, free; @@ -152,7 +152,7 @@ njs_md5_final(u_char result[16], njs_md5 */ static const u_char * -njs_md5_body(njs_md5_t *ctx, const u_char *data, size_t size) +njs_md5_body(njs_hash_t *ctx, const u_char *data, size_t size) { uint32_t a, b, c, d; uint32_t saved_a, saved_b, saved_c, saved_d; diff -r 57071ecadeb5 -r 721475693b80 src/njs_md5.h --- a/src/njs_md5.h Mon Jan 08 16:40:27 2024 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NJS_MD5_H_INCLUDED_ -#define _NJS_MD5_H_INCLUDED_ - - -typedef struct { - uint64_t bytes; - uint32_t a, b, c, d; - u_char buffer[64]; -} njs_md5_t; - - -NJS_EXPORT void njs_md5_init(njs_md5_t *ctx); -NJS_EXPORT void njs_md5_update(njs_md5_t *ctx, const void *data, size_t size); -NJS_EXPORT void njs_md5_final(u_char result[16], njs_md5_t *ctx); - -#endif /* _NJS_MD5_H_INCLUDED_ */ diff -r 57071ecadeb5 -r 721475693b80 src/njs_sha1.c --- a/src/njs_sha1.c Mon Jan 08 16:40:27 2024 -0800 +++ b/src/njs_sha1.c Mon Jan 08 16:40:42 2024 -0800 @@ -10,12 +10,12 @@ #include <njs_main.h> -static const u_char *njs_sha1_body(njs_sha1_t *ctx, const u_char *data, +static const u_char *njs_sha1_body(njs_hash_t *ctx, const u_char *data, size_t size); void -njs_sha1_init(njs_sha1_t *ctx) +njs_sha1_init(njs_hash_t *ctx) { ctx->a = 0x67452301; ctx->b = 0xefcdab89; @@ -28,7 +28,7 @@ njs_sha1_init(njs_sha1_t *ctx) void -njs_sha1_update(njs_sha1_t *ctx, const void *data, size_t size) +njs_sha1_update(njs_hash_t *ctx, const void *data, size_t size) { size_t used, free; @@ -59,7 +59,7 @@ njs_sha1_update(njs_sha1_t *ctx, const v void -njs_sha1_final(u_char result[20], njs_sha1_t *ctx) +njs_sha1_final(u_char result[32], njs_hash_t *ctx) { size_t used, free; @@ -152,7 +152,7 @@ njs_sha1_final(u_char result[20], njs_sh */ static const u_char * -njs_sha1_body(njs_sha1_t *ctx, const u_char *data, size_t size) +njs_sha1_body(njs_hash_t *ctx, const u_char *data, size_t size) { uint32_t a, b, c, d, e, temp; uint32_t saved_a, saved_b, saved_c, saved_d, saved_e; diff -r 57071ecadeb5 -r 721475693b80 src/njs_sha1.h --- a/src/njs_sha1.h Mon Jan 08 16:40:27 2024 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - - -#ifndef _NJS_SHA1_H_INCLUDED_ -#define _NJS_SHA1_H_INCLUDED_ - - -typedef struct { - uint64_t bytes; - uint32_t a, b, c, d, e; - u_char buffer[64]; -} njs_sha1_t; - - -NJS_EXPORT void njs_sha1_init(njs_sha1_t *ctx); -NJS_EXPORT void njs_sha1_update(njs_sha1_t *ctx, const void *data, size_t size); -NJS_EXPORT void njs_sha1_final(u_char result[20], njs_sha1_t *ctx); - - -#endif /* _NJS_SHA1_H_INCLUDED_ */ diff -r 57071ecadeb5 -r 721475693b80 src/njs_sha2.c --- a/src/njs_sha2.c Mon Jan 08 16:40:27 2024 -0800 +++ b/src/njs_sha2.c Mon Jan 08 16:40:42 2024 -0800 @@ -10,12 +10,12 @@ #include <njs_main.h> -static const u_char *njs_sha2_body(njs_sha2_t *ctx, const u_char *data, +static const u_char *njs_sha2_body(njs_hash_t *ctx, const u_char *data, size_t size); void -njs_sha2_init(njs_sha2_t *ctx) +njs_sha2_init(njs_hash_t *ctx) { ctx->a = 0x6a09e667; ctx->b = 0xbb67ae85; @@ -31,7 +31,7 @@ njs_sha2_init(njs_sha2_t *ctx) void -njs_sha2_update(njs_sha2_t *ctx, const void *data, size_t size) +njs_sha2_update(njs_hash_t *ctx, const void *data, size_t size) { size_t used, free; @@ -62,7 +62,7 @@ njs_sha2_update(njs_sha2_t *ctx, const v void -njs_sha2_final(u_char result[32], njs_sha2_t *ctx) +njs_sha2_final(u_char result[32], njs_hash_t *ctx) { size_t used, free; @@ -172,7 +172,7 @@ njs_sha2_final(u_char result[32], njs_sh */ static const u_char * -njs_sha2_body(njs_sha2_t *ctx, const u_char *data, size_t size) +njs_sha2_body(njs_hash_t *ctx, const u_char *data, size_t size) { uint32_t a, b, c, d, e, f, g, h, s0, s1, temp1, temp2; uint32_t saved_a, saved_b, saved_c, saved_d, saved_e, saved_f, diff -r 57071ecadeb5 -r 721475693b80 src/njs_sha2.h --- a/src/njs_sha2.h Mon Jan 08 16:40:27 2024 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - -/* - * Copyright (C) Dmitry Volyntsev - * Copyright (C) NGINX, Inc. - */ - - -#ifndef _NJS_SHA2_H_INCLUDED_ -#define _NJS_SHA2_H_INCLUDED_ - - -typedef struct { - uint64_t bytes; - uint32_t a, b, c, d, e, f, g, h; - u_char buffer[64]; -} njs_sha2_t; - - -NJS_EXPORT void njs_sha2_init(njs_sha2_t *ctx); -NJS_EXPORT void njs_sha2_update(njs_sha2_t *ctx, const void *data, size_t size); -NJS_EXPORT void njs_sha2_final(u_char result[32], njs_sha2_t *ctx); - - -#endif /* _NJS_SHA2_H_INCLUDED_ */ _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel