diff --git a/ext/posix/posix.c b/ext/posix/posix.c index b7acf8c751270..81346a2b266e7 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -621,6 +621,14 @@ PHP_FUNCTION(posix_mkfifo) RETURN_FALSE; } + if (mode < 0 || (mode & ~07777)) { + zend_argument_value_error( + 2, + "must be between 0 and 07777" + ); + RETURN_THROWS(); + } + result = mkfifo(ZSTR_VAL(path), mode); if (result < 0) { POSIX_G(last_error) = errno; diff --git a/ext/posix/tests/posix_mkfifo_invalid_mode.phpt b/ext/posix/tests/posix_mkfifo_invalid_mode.phpt new file mode 100644 index 0000000000000..5aa6c68a515f1 --- /dev/null +++ b/ext/posix/tests/posix_mkfifo_invalid_mode.phpt @@ -0,0 +1,36 @@ +--TEST-- +posix_mkfifo(): invalid mode argument +--SKIPIF-- + +--FILE-- +getMessage(), "\n"; +} + +// Too large mode +try { + posix_mkfifo(__DIR__ . "/testfifo2", 010000); // > 07777 +} catch (ValueError $e) { + echo $e->getMessage(), "\n"; +} + +// Garbage bits +try { + posix_mkfifo(__DIR__ . "/testfifo3", 020000); // S_IFCHR bit +} catch (ValueError $e) { + echo $e->getMessage(), "\n"; +} +?> +--EXPECTF-- +posix_mkfifo(): Argument #2 ($permissions) must be between 0 and 07777 +posix_mkfifo(): Argument #2 ($permissions) must be between 0 and 07777 +posix_mkfifo(): Argument #2 ($permissions) must be between 0 and 07777