Skip to content

Commit 55de624

Browse files
committed
fileinfo: Preserve error for uninitialized finfo objects
1 parent 9415fb9 commit 55de624

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

ext/fileinfo/fileinfo.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,11 @@ PHP_FUNCTION(finfo_set_flags)
234234
RETURN_THROWS();
235235
}
236236

237+
if (!Z_FINFO_P(self)->magic) {
238+
zend_throw_error(NULL, "Invalid finfo object");
239+
RETURN_THROWS();
240+
}
241+
237242
/* We do not check the return value as it can only ever fail if options contains MAGIC_PRESERVE_ATIME
238243
* and the system neither has utime(3) nor utimes(2). Something incredibly unlikely. */
239244
magic_setflags(Z_FINFO_P(self)->magic, options);
@@ -301,6 +306,11 @@ PHP_FUNCTION(finfo_file)
301306
RETURN_THROWS();
302307
}
303308

309+
if (!Z_FINFO_P(self)->magic) {
310+
zend_throw_error(NULL, "Invalid finfo object");
311+
RETURN_THROWS();
312+
}
313+
304314
struct magic_set *magic = Z_FINFO_P(self)->magic;
305315

306316
if (UNEXPECTED(ZSTR_LEN(path) == 0)) {
@@ -346,6 +356,11 @@ PHP_FUNCTION(finfo_buffer)
346356
RETURN_THROWS();
347357
}
348358

359+
if (!Z_FINFO_P(self)->magic) {
360+
zend_throw_error(NULL, "Invalid finfo object");
361+
RETURN_THROWS();
362+
}
363+
349364
struct magic_set *magic = Z_FINFO_P(self)->magic;
350365

351366
/* Set options for the current file/buffer. */
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
--TEST--
2+
Fileinfo uninitialized object
3+
--EXTENSIONS--
4+
fileinfo
5+
--FILE--
6+
<?php
7+
8+
$finfo = (new ReflectionClass('finfo'))->newInstanceWithoutConstructor();
9+
10+
try {
11+
var_dump(finfo_set_flags($finfo, FILEINFO_NONE));
12+
} catch (Error $e) {
13+
echo $e::class, ": ", $e->getMessage(), PHP_EOL;
14+
}
15+
16+
try {
17+
var_dump($finfo->set_flags(FILEINFO_NONE));
18+
} catch (Error $e) {
19+
echo $e::class, ": ", $e->getMessage(), PHP_EOL;
20+
}
21+
22+
try {
23+
var_dump(finfo_file($finfo, __FILE__));
24+
} catch (Error $e) {
25+
echo $e::class, ": ", $e->getMessage(), PHP_EOL;
26+
}
27+
28+
try {
29+
var_dump($finfo->file(__FILE__));
30+
} catch (Error $e) {
31+
echo $e::class, ": ", $e->getMessage(), PHP_EOL;
32+
}
33+
34+
try {
35+
var_dump(finfo_buffer($finfo, file_get_contents(__FILE__)));
36+
} catch (Error $e) {
37+
echo $e::class, ": ", $e->getMessage(), PHP_EOL;
38+
}
39+
40+
try {
41+
var_dump($finfo->file(file_get_contents(__FILE__)));
42+
} catch (Error $e) {
43+
echo $e::class, ": ", $e->getMessage(), PHP_EOL;
44+
}
45+
46+
?>
47+
--EXPECT--
48+
Error: Invalid finfo object
49+
Error: Invalid finfo object
50+
Error: Invalid finfo object
51+
Error: Invalid finfo object
52+
Error: Invalid finfo object
53+
Error: Invalid finfo object

0 commit comments

Comments
 (0)