Skip to content

Commit 4c816d7

Browse files
committed
Fix phpGH-18281: making flock flags mutually exclusive.
1 parent 1684c52 commit 4c816d7

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

Diff for: ext/standard/file.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -181,14 +181,20 @@ PHP_MSHUTDOWN_FUNCTION(file) /* {{{ */
181181
}
182182
/* }}} */
183183

184+
static inline bool php_is_valid_flock_flag(zend_long s) {
185+
const zend_long sb = s & ~PHP_LOCK_NB;
186+
if (sb == PHP_LOCK_UN) return true;
187+
return (sb == PHP_LOCK_SH || sb == PHP_LOCK_EX);
188+
}
189+
184190
PHPAPI void php_flock_common(php_stream *stream, zend_long operation,
185191
uint32_t operation_arg_num, zval *wouldblock, zval *return_value)
186192
{
187193
int flock_values[] = { LOCK_SH, LOCK_EX, LOCK_UN };
188194
int act;
189195

190196
act = operation & PHP_LOCK_UN;
191-
if (act < 1 || act > 3) {
197+
if (act < 1 || act > 3 || !php_is_valid_flock_flag(operation)) {
192198
zend_argument_value_error(operation_arg_num, "must be one of LOCK_SH, LOCK_EX, or LOCK_UN");
193199
RETURN_THROWS();
194200
}

Diff for: ext/standard/tests/file/flock.phpt

+6-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ var_dump($would);
3131
var_dump(flock($fp, LOCK_UN, $would));
3232
var_dump($would);
3333

34-
var_dump(flock($fp, -1));
34+
try {
35+
var_dump(flock($fp, -1));
36+
} catch (\ValueError $e) {
37+
echo $e->getMessage() . \PHP_EOL;
38+
}
3539

3640
try {
3741
var_dump(flock($fp, 0));
@@ -59,5 +63,5 @@ bool(true)
5963
int(0)
6064
bool(true)
6165
int(0)
62-
bool(true)
66+
flock(): Argument #2 ($operation) must be one of LOCK_SH, LOCK_EX, or LOCK_UN
6367
flock(): Argument #2 ($operation) must be one of LOCK_SH, LOCK_EX, or LOCK_UN

0 commit comments

Comments
 (0)