On 1/3/24 4:55 PM, Ben Kallus wrote:
When I run my nginx+njs application with UBSan enabled, I encounter a
few instances of undefined behavior in njs:
1. A memcpy from NULL
2. A couple of offsets applied to NULL
3. A u32 assigned to nan
4. A u32 assigned to inf
This patch adds checks to prevent these undefined operations. With it,
my application no longer has any UBSan alerts.
Hi Ben,
I did a bunch of patches related to UBSan in njs core, most notably
https://hg.nginx.org/njs/rev/0490f1ae4cf5.
Now unit tests and test262 pass without warnings.
Thank you for prodding.
# HG changeset patch
# User Ben Kallus <benjamin.p.kallus...@dartmouth.edu>
# Date 1704329280 18000
# Wed Jan 03 19:48:00 2024 -0500
# Node ID 85d5846984fc2731ad74f91f21c74be67d6974a9
# Parent 4a15613f4e8bb4a8349ee1cefbae07585da4cbc6
Prevent undefined operations on NULL, INF, and NAN
diff -r 4a15613f4e8b -r 85d5846984fc nginx/ngx_http_js_module.c
--- a/nginx/ngx_http_js_module.c Tue Dec 19 12:37:05 2023 -0800
+++ b/nginx/ngx_http_js_module.c Wed Jan 03 19:48:00 2024 -0500
@@ -2717,7 +2717,9 @@
for ( /* void */ ; cl; cl = cl->next) {
buf = cl->buf;
- p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);
+ if (buf->last - buf->pos > 0) {
+ p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);
+ }
}
done:
diff -r 4a15613f4e8b -r 85d5846984fc src/njs_extern.c
--- a/src/njs_extern.c Tue Dec 19 12:37:05 2023 -0800
+++ b/src/njs_extern.c Wed Jan 03 19:48:00 2024 -0500
@@ -38,7 +38,10 @@
lhq.proto = &njs_object_hash_proto;
lhq.pool = vm->mem_pool;
- end = external + n;
+ end = external;
+ if (n > 0) {
+ end += n;
+ }
while (external < end) {
diff -r 4a15613f4e8b -r 85d5846984fc src/njs_number.h
--- a/src/njs_number.h Tue Dec 19 12:37:05 2023 -0800
+++ b/src/njs_number.h Wed Jan 03 19:48:00 2024 -0500
@@ -41,6 +41,10 @@
{
uint32_t u32;
+ if (isnan(num) || isinf(num)) {
+ return 0;
+ }
+
u32 = num;
return (u32 == num && u32 != 0xffffffff);
diff -r 4a15613f4e8b -r 85d5846984fc src/njs_object.c
--- a/src/njs_object.c Tue Dec 19 12:37:05 2023 -0800
+++ b/src/njs_object.c Wed Jan 03 19:48:00 2024 -0500
@@ -598,7 +598,10 @@
start = array->start;
p = start;
- end = p + array->length;
+ end = p;
+ if (array->length > 0) {
+ end += array->length;
+ }
switch (kind) {
case NJS_ENUM_KEYS:
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel