@@ -13,37 +13,44 @@ const {
13
13
14
14
const { kMaxLength } = require ( 'buffer' ) ;
15
15
const kMaxUint32 = Math . pow ( 2 , 32 ) - 1 ;
16
+ const kMaxPossibleLength = Math . min ( kMaxLength , kMaxUint32 ) ;
16
17
17
- function assertOffset ( offset , length ) {
18
- if ( typeof offset !== 'number' || Number . isNaN ( offset ) ) {
19
- throw new ERR_INVALID_ARG_TYPE ( 'offset' , 'number' ) ;
18
+ function assertOffset ( offset , elementSize , length ) {
19
+ if ( typeof offset !== 'number' ) {
20
+ throw new ERR_INVALID_ARG_TYPE ( 'offset' , 'number' , offset ) ;
20
21
}
21
22
22
- if ( offset > kMaxUint32 || offset < 0 ) {
23
- throw new ERR_INVALID_ARG_TYPE ( 'offset' , 'uint32' ) ;
24
- }
23
+ offset *= elementSize ;
25
24
26
- if ( offset > kMaxLength || offset > length ) {
27
- throw new ERR_OUT_OF_RANGE ( 'offset' ) ;
25
+ const maxLength = Math . min ( length , kMaxPossibleLength ) ;
26
+ if ( Number . isNaN ( offset ) || offset > maxLength || offset < 0 ) {
27
+ throw new ERR_OUT_OF_RANGE ( 'offset' , `>= 0 && <= ${ maxLength } ` , offset ) ;
28
28
}
29
+
30
+ return offset ;
29
31
}
30
32
31
- function assertSize ( size , offset = 0 , length = Infinity ) {
32
- if ( typeof size !== 'number' || Number . isNaN ( size ) ) {
33
- throw new ERR_INVALID_ARG_TYPE ( 'size' , 'number' ) ;
33
+ function assertSize ( size , elementSize , offset , length ) {
34
+ if ( typeof size !== 'number' ) {
35
+ throw new ERR_INVALID_ARG_TYPE ( 'size' , 'number' , size ) ;
34
36
}
35
37
36
- if ( size > kMaxUint32 || size < 0 ) {
37
- throw new ERR_INVALID_ARG_TYPE ( 'size' , 'uint32' ) ;
38
+ size *= elementSize ;
39
+
40
+ if ( Number . isNaN ( size ) || size > kMaxPossibleLength || size < 0 ) {
41
+ throw new ERR_OUT_OF_RANGE ( 'size' ,
42
+ `>= 0 && <= ${ kMaxPossibleLength } ` , size ) ;
38
43
}
39
44
40
- if ( size + offset > length || size > kMaxLength ) {
41
- throw new ERR_OUT_OF_RANGE ( 'size' ) ;
45
+ if ( size + offset > length ) {
46
+ throw new ERR_OUT_OF_RANGE ( 'size + offset' , `<= ${ length } ` , size + offset ) ;
42
47
}
48
+
49
+ return size ;
43
50
}
44
51
45
52
function randomBytes ( size , cb ) {
46
- assertSize ( size ) ;
53
+ assertSize ( size , 1 , 0 , Infinity ) ;
47
54
if ( cb !== undefined && typeof cb !== 'function' )
48
55
throw new ERR_INVALID_CALLBACK ( ) ;
49
56
return _randomBytes ( size , cb ) ;
@@ -56,17 +63,14 @@ function randomFillSync(buf, offset = 0, size) {
56
63
57
64
const elementSize = buf . BYTES_PER_ELEMENT || 1 ;
58
65
59
- offset *= elementSize ;
60
- assertOffset ( offset , buf . byteLength ) ;
66
+ offset = assertOffset ( offset , elementSize , buf . byteLength ) ;
61
67
62
68
if ( size === undefined ) {
63
69
size = buf . byteLength - offset ;
64
70
} else {
65
- size *= elementSize ;
71
+ size = assertSize ( size , elementSize , offset , buf . byteLength ) ;
66
72
}
67
73
68
- assertSize ( size , offset , buf . byteLength ) ;
69
-
70
74
return _randomFill ( buf , offset , size ) ;
71
75
}
72
76
@@ -83,20 +87,19 @@ function randomFill(buf, offset, size, cb) {
83
87
size = buf . bytesLength ;
84
88
} else if ( typeof size === 'function' ) {
85
89
cb = size ;
86
- offset *= elementSize ;
87
90
size = buf . byteLength - offset ;
88
91
} else if ( typeof cb !== 'function' ) {
89
92
throw new ERR_INVALID_CALLBACK ( ) ;
90
93
}
94
+
95
+ offset = assertOffset ( offset , elementSize , buf . byteLength ) ;
96
+
91
97
if ( size === undefined ) {
92
98
size = buf . byteLength - offset ;
93
99
} else {
94
- size *= elementSize ;
100
+ size = assertSize ( size , elementSize , offset , buf . byteLength ) ;
95
101
}
96
102
97
- assertOffset ( offset , buf . byteLength ) ;
98
- assertSize ( size , offset , buf . byteLength ) ;
99
-
100
103
return _randomFill ( buf , offset , size , cb ) ;
101
104
}
102
105
0 commit comments