diff --git a/ext/standard/tests/streams/gh21700.phpt b/ext/standard/tests/streams/gh21700.phpt new file mode 100644 index 000000000000..a67032380962 --- /dev/null +++ b/ext/standard/tests/streams/gh21700.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-21700 (_php_stream_seek assertion on SEEK_CUR with resolved negative offset) +--CREDITS-- +YuanchengJiang +--FILE-- +pos = $offset; return true; } + function stream_tell(): int { return $this->pos; } +} +stream_wrapper_register("gh21700", "wrapper"); +$fp = fopen("gh21700://", "rb"); +var_dump(fseek($fp, -1, SEEK_CUR)); +var_dump(fseek($fp, 0, SEEK_CUR)); +fclose($fp); +?> +--EXPECT-- +int(-1) +int(0) diff --git a/main/streams/streams.c b/main/streams/streams.c index 201e59446cf4..f2896357c0ed 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1414,7 +1414,8 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) offset = stream->position + offset; } whence = SEEK_SET; - break; + /* fall through to reject a possible negative offset */ + ZEND_FALLTHROUGH; case SEEK_SET: if (offset < 0) { return -1;