Skip to content

Commit 08939c8

Browse files
committed
fix(sqlite3): avoid UB when fseek(PHP_INT_MIN) on BLOB streams
1 parent 03ca089 commit 08939c8

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

ext/sqlite3/sqlite3.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,7 @@ static int php_sqlite3_stream_seek(php_stream *stream, zend_off_t offset, int wh
11491149
switch(whence) {
11501150
case SEEK_CUR:
11511151
if (offset < 0) {
1152-
if (sqlite3_stream->position < (size_t)(-offset)) {
1152+
if (sqlite3_stream->position < -(size_t)offset) {
11531153
sqlite3_stream->position = 0;
11541154
*newoffs = -1;
11551155
return -1;
@@ -1190,7 +1190,7 @@ static int php_sqlite3_stream_seek(php_stream *stream, zend_off_t offset, int wh
11901190
sqlite3_stream->position = sqlite3_stream->size;
11911191
*newoffs = -1;
11921192
return -1;
1193-
} else if (sqlite3_stream->size < (size_t)(-offset)) {
1193+
} else if (sqlite3_stream->size < -(size_t)offset) {
11941194
sqlite3_stream->position = 0;
11951195
*newoffs = -1;
11961196
return -1;

ext/sqlite3/tests/bug20962.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
Bug #20962 SQLite3 BLOB stream fseek with PHP_INT_MIN (non-PDO)
3+
--FILE--
4+
<?php
5+
$db = new SQLite3(':memory:');
6+
7+
$db->exec('CREATE TABLE test (id TEXT, data BLOB)');
8+
9+
$stmt = $db->prepare('INSERT INTO test (id, data) VALUES (:id, :data)');
10+
$stmt->bindValue(':id', 'a', SQLITE3_TEXT);
11+
$stmt->bindValue(':data', 'TEST TEST', SQLITE3_BLOB);
12+
$stmt->execute();
13+
14+
$row = $db->querySingle("SELECT data FROM test WHERE id='a'", true);
15+
16+
$stream = $db->openBlob('test', 'data', 1);
17+
var_dump(fseek($stream, PHP_INT_MIN, SEEK_END));
18+
?>
19+
--EXPECT--
20+
int(-1)

0 commit comments

Comments
 (0)