Skip to content

Commit 97c6da1

Browse files
authored
random/standard: Correctly handle broken engines in php_array_pick_keys (#13138)
1 parent df85c25 commit 97c6da1

File tree

5 files changed

+383
-1
lines changed

5 files changed

+383
-1
lines changed

Diff for: NEWS

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ PHP NEWS
1313
- Phar:
1414
. Fixed bug #71465 (PHAR doesn't know about litespeed). (nielsdos)
1515

16+
- Random:
17+
. Fixed bug GH-13138 (Randomizer::pickArrayKeys() does not detect broken
18+
engines). (timwolla)
19+
1620
18 Jan 2024, PHP 8.2.15
1721

1822
- Core:

Diff for: ext/random/tests/03_randomizer/engine_unsafe_biased.phpt

+14
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ try {
4343
echo $e->getMessage(), PHP_EOL;
4444
}
4545

46+
try {
47+
var_dump(randomizer()->pickArrayKeys(range(1, 1234), 1));
48+
} catch (Random\BrokenRandomEngineError $e) {
49+
echo $e->getMessage(), PHP_EOL;
50+
}
51+
52+
try {
53+
var_dump(randomizer()->pickArrayKeys(range(1, 1234), 10));
54+
} catch (Random\BrokenRandomEngineError $e) {
55+
echo $e->getMessage(), PHP_EOL;
56+
}
57+
4658
try {
4759
var_dump(randomizer()->shuffleBytes('foobar'));
4860
} catch (Random\BrokenRandomEngineError $e) {
@@ -56,3 +68,5 @@ int(%d)
5668
string(2) "ff"
5769
Failed to generate an acceptable random number in 50 attempts
5870
Failed to generate an acceptable random number in 50 attempts
71+
Failed to generate an acceptable random number in 50 attempts
72+
Failed to generate an acceptable random number in 50 attempts

Diff for: ext/random/tests/03_randomizer/engine_unsafe_empty_string.phpt

+14
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ try {
4343
echo $e->getMessage(), PHP_EOL;
4444
}
4545

46+
try {
47+
var_dump(randomizer()->pickArrayKeys(range(1, 1234), 1));
48+
} catch (Random\BrokenRandomEngineError $e) {
49+
echo $e->getMessage(), PHP_EOL;
50+
}
51+
52+
try {
53+
var_dump(randomizer()->pickArrayKeys(range(1, 1234), 10));
54+
} catch (Random\BrokenRandomEngineError $e) {
55+
echo $e->getMessage(), PHP_EOL;
56+
}
57+
4658
try {
4759
var_dump(randomizer()->shuffleBytes('foobar'));
4860
} catch (Random\BrokenRandomEngineError $e) {
@@ -56,3 +68,5 @@ A random engine must return a non-empty string
5668
A random engine must return a non-empty string
5769
A random engine must return a non-empty string
5870
A random engine must return a non-empty string
71+
A random engine must return a non-empty string
72+
A random engine must return a non-empty string
+322
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
--TEST--
2+
Random: Randomizer: Nul engines are correctly handled
3+
--FILE--
4+
<?php
5+
6+
use Random\Engine;
7+
use Random\Randomizer;
8+
9+
final class NulEngine implements Engine
10+
{
11+
public function generate(): string
12+
{
13+
return str_repeat("\x00", PHP_INT_SIZE);
14+
}
15+
}
16+
17+
function randomizer(): Randomizer
18+
{
19+
return new Randomizer(new NulEngine());
20+
}
21+
22+
try {
23+
var_dump(randomizer()->getInt(0, 1234));
24+
} catch (Random\BrokenRandomEngineError $e) {
25+
echo $e->getMessage(), PHP_EOL;
26+
}
27+
28+
try {
29+
var_dump(randomizer()->nextInt());
30+
} catch (Random\BrokenRandomEngineError $e) {
31+
echo $e->getMessage(), PHP_EOL;
32+
}
33+
34+
try {
35+
var_dump(bin2hex(randomizer()->getBytes(1)));
36+
} catch (Random\BrokenRandomEngineError $e) {
37+
echo $e->getMessage(), PHP_EOL;
38+
}
39+
40+
try {
41+
var_dump(randomizer()->shuffleArray(range(1, 123)));
42+
} catch (Random\BrokenRandomEngineError $e) {
43+
echo $e->getMessage(), PHP_EOL;
44+
}
45+
46+
try {
47+
var_dump(randomizer()->pickArrayKeys(range(1, 123), 1));
48+
} catch (Random\BrokenRandomEngineError $e) {
49+
echo $e->getMessage(), PHP_EOL;
50+
}
51+
52+
try {
53+
var_dump(randomizer()->pickArrayKeys(range(1, 123), 10));
54+
} catch (Random\BrokenRandomEngineError $e) {
55+
echo $e->getMessage(), PHP_EOL;
56+
}
57+
58+
try {
59+
var_dump(randomizer()->shuffleBytes('foobar'));
60+
} catch (Random\BrokenRandomEngineError $e) {
61+
echo $e->getMessage(), PHP_EOL;
62+
}
63+
64+
?>
65+
--EXPECTF--
66+
int(0)
67+
int(0)
68+
string(2) "00"
69+
array(123) {
70+
[0]=>
71+
int(2)
72+
[1]=>
73+
int(3)
74+
[2]=>
75+
int(4)
76+
[3]=>
77+
int(5)
78+
[4]=>
79+
int(6)
80+
[5]=>
81+
int(7)
82+
[6]=>
83+
int(8)
84+
[7]=>
85+
int(9)
86+
[8]=>
87+
int(10)
88+
[9]=>
89+
int(11)
90+
[10]=>
91+
int(12)
92+
[11]=>
93+
int(13)
94+
[12]=>
95+
int(14)
96+
[13]=>
97+
int(15)
98+
[14]=>
99+
int(16)
100+
[15]=>
101+
int(17)
102+
[16]=>
103+
int(18)
104+
[17]=>
105+
int(19)
106+
[18]=>
107+
int(20)
108+
[19]=>
109+
int(21)
110+
[20]=>
111+
int(22)
112+
[21]=>
113+
int(23)
114+
[22]=>
115+
int(24)
116+
[23]=>
117+
int(25)
118+
[24]=>
119+
int(26)
120+
[25]=>
121+
int(27)
122+
[26]=>
123+
int(28)
124+
[27]=>
125+
int(29)
126+
[28]=>
127+
int(30)
128+
[29]=>
129+
int(31)
130+
[30]=>
131+
int(32)
132+
[31]=>
133+
int(33)
134+
[32]=>
135+
int(34)
136+
[33]=>
137+
int(35)
138+
[34]=>
139+
int(36)
140+
[35]=>
141+
int(37)
142+
[36]=>
143+
int(38)
144+
[37]=>
145+
int(39)
146+
[38]=>
147+
int(40)
148+
[39]=>
149+
int(41)
150+
[40]=>
151+
int(42)
152+
[41]=>
153+
int(43)
154+
[42]=>
155+
int(44)
156+
[43]=>
157+
int(45)
158+
[44]=>
159+
int(46)
160+
[45]=>
161+
int(47)
162+
[46]=>
163+
int(48)
164+
[47]=>
165+
int(49)
166+
[48]=>
167+
int(50)
168+
[49]=>
169+
int(51)
170+
[50]=>
171+
int(52)
172+
[51]=>
173+
int(53)
174+
[52]=>
175+
int(54)
176+
[53]=>
177+
int(55)
178+
[54]=>
179+
int(56)
180+
[55]=>
181+
int(57)
182+
[56]=>
183+
int(58)
184+
[57]=>
185+
int(59)
186+
[58]=>
187+
int(60)
188+
[59]=>
189+
int(61)
190+
[60]=>
191+
int(62)
192+
[61]=>
193+
int(63)
194+
[62]=>
195+
int(64)
196+
[63]=>
197+
int(65)
198+
[64]=>
199+
int(66)
200+
[65]=>
201+
int(67)
202+
[66]=>
203+
int(68)
204+
[67]=>
205+
int(69)
206+
[68]=>
207+
int(70)
208+
[69]=>
209+
int(71)
210+
[70]=>
211+
int(72)
212+
[71]=>
213+
int(73)
214+
[72]=>
215+
int(74)
216+
[73]=>
217+
int(75)
218+
[74]=>
219+
int(76)
220+
[75]=>
221+
int(77)
222+
[76]=>
223+
int(78)
224+
[77]=>
225+
int(79)
226+
[78]=>
227+
int(80)
228+
[79]=>
229+
int(81)
230+
[80]=>
231+
int(82)
232+
[81]=>
233+
int(83)
234+
[82]=>
235+
int(84)
236+
[83]=>
237+
int(85)
238+
[84]=>
239+
int(86)
240+
[85]=>
241+
int(87)
242+
[86]=>
243+
int(88)
244+
[87]=>
245+
int(89)
246+
[88]=>
247+
int(90)
248+
[89]=>
249+
int(91)
250+
[90]=>
251+
int(92)
252+
[91]=>
253+
int(93)
254+
[92]=>
255+
int(94)
256+
[93]=>
257+
int(95)
258+
[94]=>
259+
int(96)
260+
[95]=>
261+
int(97)
262+
[96]=>
263+
int(98)
264+
[97]=>
265+
int(99)
266+
[98]=>
267+
int(100)
268+
[99]=>
269+
int(101)
270+
[100]=>
271+
int(102)
272+
[101]=>
273+
int(103)
274+
[102]=>
275+
int(104)
276+
[103]=>
277+
int(105)
278+
[104]=>
279+
int(106)
280+
[105]=>
281+
int(107)
282+
[106]=>
283+
int(108)
284+
[107]=>
285+
int(109)
286+
[108]=>
287+
int(110)
288+
[109]=>
289+
int(111)
290+
[110]=>
291+
int(112)
292+
[111]=>
293+
int(113)
294+
[112]=>
295+
int(114)
296+
[113]=>
297+
int(115)
298+
[114]=>
299+
int(116)
300+
[115]=>
301+
int(117)
302+
[116]=>
303+
int(118)
304+
[117]=>
305+
int(119)
306+
[118]=>
307+
int(120)
308+
[119]=>
309+
int(121)
310+
[120]=>
311+
int(122)
312+
[121]=>
313+
int(123)
314+
[122]=>
315+
int(1)
316+
}
317+
array(1) {
318+
[0]=>
319+
int(0)
320+
}
321+
Failed to generate an acceptable random number in 50 attempts
322+
string(6) "oobarf"

0 commit comments

Comments
 (0)