JSValueConst *argv, int ignored)
{
JSValue buffer, ret;
- uint32_t size;
+ uint64_t size;
if (!JS_IsNumber(argv[0])) {
return JS_ThrowTypeError(ctx, "The \"size\" argument must be of type"
" number");
}
- if (JS_ToUint32(ctx, &size, argv[0])) {
+ if (JS_ToIndex(ctx, &size, argv[0])) {
return JS_EXCEPTION;
}
{
u_char *p;
size_t n;
+ uint64_t len;
JSValue list, length, val, ret, buffer;
- uint32_t i, len, list_len;
+ uint32_t i, list_len;
njs_str_t buf, dst;
list = argv[0];
" instance of Buffer or Uint8Array", i);
}
- if ((SIZE_MAX - len) < buf.length) {
- return JS_ThrowTypeError(ctx,
- "Total size of buffers is too large");
+ if (buf.length > QJS_BUFFER_MAX_LENGTH - len) {
+ return JS_ThrowRangeError(ctx,
+ "Total size of buffers is too large");
}
len += buf.length;
}
} else {
- if (JS_ToUint32(ctx, &len, argv[1])) {
+ if (JS_ToIndex(ctx, &len, argv[1])) {
return JS_EXCEPTION;
}
}
};
+let oversized_tsuite = {
+ name: "Buffer allocation size tests",
+ skip: () => (!has_buffer() || !has_njs()),
+ T: async (params) => {
+ assert.throws(RangeError, () => {
+ if (params.method === 'alloc') {
+ Buffer.alloc(params.size);
+
+ } else {
+ Buffer.concat([], params.size);
+ }
+ });
+
+ return 'SUCCESS';
+ },
+ tests: [
+ { method: 'alloc', size: 0x100000000 },
+ { method: 'alloc', size: 0x100000010 },
+ { method: 'concat', size: 0x100000000 },
+ { method: 'concat', size: 0x100000010 },
+ ],
+};
+
+
let fromObject_tsuite = {
name: "Buffer.from() array-like length tests",
skip: () => (!has_buffer()),
run([
alloc_tsuite,
+ oversized_tsuite,
fromObject_tsuite,
fromObjectLarge_tsuite,
byteLength_tsuite,