Previously, DataView.prototype.setXXX() wrote directly into the
underlying ArrayBuffer without making a private copy of shared data.
As a result, writing through a DataView over r.requestBuffer in nginx
modified the request body seen by subsequent reads.
Now, the buffer is made writable before the write, as is done for
typed arrays.
The issue was introduced in
409004cb (0.4.4).
return NJS_ERROR;
}
- buffer = view->buffer;
+ buffer = njs_typed_array_writable(vm, view);
+ if (njs_slow_path(buffer == NULL)) {
+ return NJS_ERROR;
+ }
+
u8 = &buffer->u.u8[index + view->offset];
switch (type) {
{ njs_str("new Uint8Array($r.buffer.sort().slice(0,3))"),
njs_str("129,144,145") },
+ { njs_str("var b = $r.buffer; "
+ "var v = new DataView(b.buffer, b.byteOffset);"
+ "v.setUint8(0, '@'.codePointAt(0));"
+ "[b[0], $r.buffer[0]]"),
+ njs_str("64,208") },
+
{ njs_str("$r.buffer instanceof Buffer"),
njs_str("true") },