aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/bun.js/bindings/JSBuffer.cpp12
-rw-r--r--test/js/node/buffer.test.js14
2 files changed, 23 insertions, 3 deletions
diff --git a/src/bun.js/bindings/JSBuffer.cpp b/src/bun.js/bindings/JSBuffer.cpp
index 524007f86..543ef2ea3 100644
--- a/src/bun.js/bindings/JSBuffer.cpp
+++ b/src/bun.js/bindings/JSBuffer.cpp
@@ -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) {
diff --git a/test/js/node/buffer.test.js b/test/js/node/buffer.test.js
index 0256934ce..450129b0e 100644
--- a/test/js/node/buffer.test.js
+++ b/test/js/node/buffer.test.js
@@ -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", () => {