]> git.kaiwu.me - njs.git/commitdiff
Fixed Buffer float access alignment
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 22 May 2026 03:31:42 +0000 (20:31 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Tue, 26 May 2026 21:45:24 +0000 (14:45 -0700)
src/njs_buffer.c
src/qjs_buffer.c
test/buffer.t.js

index bd987c5f2439effe4f3e6124a1e40c481b64c923..49ead27740750452eaf8282ce7b78747fff4fafc 100644 (file)
@@ -1225,7 +1225,7 @@ njs_buffer_prototype_read_float(njs_vm_t *vm, njs_value_t *args,
 
     switch (size) {
     case 4:
-        u32 = *((uint32_t *) u8);
+        u32 = njs_get_u32(u8);
 
         if (swap) {
             u32 = njs_bswap_u32(u32);
@@ -1237,7 +1237,7 @@ njs_buffer_prototype_read_float(njs_vm_t *vm, njs_value_t *args,
 
     case 8:
     default:
-        conv_f64.u = *((uint64_t *) u8);
+        conv_f64.u = njs_get_u64(u8);
 
         if (swap) {
             conv_f64.u = njs_bswap_u64(conv_f64.u);
@@ -1569,7 +1569,7 @@ njs_buffer_prototype_write_float(njs_vm_t *vm, njs_value_t *args,
             conv_f32.u = njs_bswap_u32(conv_f32.u);
         }
 
-        *((uint32_t *) u8) = conv_f32.u;
+        njs_set_u32(u8, conv_f32.u);
         break;
 
     case 8:
@@ -1580,7 +1580,7 @@ njs_buffer_prototype_write_float(njs_vm_t *vm, njs_value_t *args,
             conv_f64.u = njs_bswap_u64(conv_f64.u);
         }
 
-        *((uint64_t *) u8) = conv_f64.u;
+        njs_set_u64(u8, conv_f64.u);
     }
 
     njs_set_number(retval, index + size);
index aa597764587ef1381257a51fa62d08594ec9e470..2243822d090da47ba9d14a64d22779b21e313aa6 100644 (file)
@@ -1123,7 +1123,7 @@ qjs_buffer_prototype_read_float(JSContext *ctx, JSValueConst this_val,
 
     switch (size) {
     case 4:
-        u32 = *((uint32_t *) &self.start[index]);
+        u32 = njs_get_u32(&self.start[index]);
 
         if (swap) {
             u32 = njs_bswap_u32(u32);
@@ -1135,7 +1135,7 @@ qjs_buffer_prototype_read_float(JSContext *ctx, JSValueConst this_val,
 
     case 8:
     default:
-        u64 = *((uint64_t *) &self.start[index]);
+        u64 = njs_get_u64(&self.start[index]);
 
         if (swap) {
             u64 = njs_bswap_u64(u64);
index 71aa73a2ba273db8c816d01606692470898831d6..d02dca1f5530c1cc28eb39e3c81ff232e97c07c7 100644 (file)
@@ -692,6 +692,24 @@ let readFloat_tsuite = {
             throw Error(`unexpected output "${b.readFloatBE(0)}" != "123.125"`);
         }
 
+        r = b.writeFloatLE(123.125, 1);
+        if (r !== 5) {
+            throw Error(`unexpected output "${r}" != "5"`);
+        }
+
+        if (b.readFloatLE(1) !== 123.125) {
+            throw Error(`unexpected output "${b.readFloatLE(1)}" != "123.125"`);
+        }
+
+        r = b.writeFloatBE(123.125, 1);
+        if (r !== 5) {
+            throw Error(`unexpected output "${r}" != "5"`);
+        }
+
+        if (b.readFloatBE(1) !== 123.125) {
+            throw Error(`unexpected output "${b.readFloatBE(1)}" != "123.125"`);
+        }
+
         r = b.writeDoubleLE(123.125, 1);
         if (r !== 9) {
             throw Error(`unexpected output "${r}" != "9"`);