fix(node:buffer): fix the behavior of totalLength in Buffer.concat (#6574)

* fix(node:buffer): fix the behavior of `totalLength` in `Buffer.concat`
Close: #6570
Close: #3639

* fix buffer totalLength type

---------

Co-authored-by: Ashcon Partovi <ashcon@partovi.net>
This commit is contained in:
Ai Hoshino
2023-10-19 05:30:53 +08:00
committed by GitHub
parent 35259c0c1d
commit 0173571b19
2 changed files with 23 additions and 3 deletions

View File

@@ -742,10 +742,16 @@ static inline JSC::EncodedJSValue jsBufferConstructorFunction_concatBody(JSC::JS
byteLength += typedArray->length();
}
if (callFrame->argumentCount() > 1) {
auto byteLengthValue = callFrame->uncheckedArgument(1);
byteLength = std::min(byteLength, byteLengthValue.toTypedArrayIndex(lexicalGlobalObject, "totalLength must be a valid number"_s));
JSValue totalLengthValue = callFrame->argument(1);
if (!totalLengthValue.isUndefined()) {
if (UNLIKELY(!totalLengthValue.isNumber())) {
throwTypeError(lexicalGlobalObject, throwScope, "totalLength must be a valid number"_s);
return JSValue::encode(jsUndefined());
}
auto totalLength = totalLengthValue.toTypedArrayIndex(lexicalGlobalObject, "totalLength must be a valid number"_s);
RETURN_IF_EXCEPTION(throwScope, {});
byteLength = totalLength;
}
if (byteLength == 0) {

View File

@@ -1327,6 +1327,20 @@ it("Buffer.concat", () => {
expect(Buffer.concat([array1, array2, array3], 222).length).toBe(222);
expect(Buffer.concat([array1, array2, array3], 222).subarray(0, 128).join("")).toBe("100".repeat(128));
expect(Buffer.concat([array1, array2, array3], 222).subarray(129, 222).join("")).toBe("200".repeat(222 - 129));
expect(() => {
Buffer.concat([array1], -1);
}).toThrow(RangeError);
expect(() => {
Buffer.concat([array1], "1");
}).toThrow(TypeError);
// issue#6570
expect(Buffer.concat([array1, array2, array3], undefined).join("")).toBe(
array1.join("") + array2.join("") + array3.join(""),
);
// issue#3639
expect(Buffer.concat([array1, array2, array3], 128 * 4).join("")).toBe(
array1.join("") + array2.join("") + array3.join("") + Buffer.alloc(128).join(""),
);
});
it("read", () => {