Skip to content

Commit 0f79b1b

Browse files
committed
Fix #79099: OOB read in php_strip_tags_ex
1 parent f79c774 commit 0f79b1b

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

ext/standard/string.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4866,7 +4866,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, uint8_t *stateptr, const
48664866
if (state == 4) {
48674867
/* Inside <!-- comment --> */
48684868
break;
4869-
} else if (state == 2 && *(p-1) != '\\') {
4869+
} else if (state == 2 && p >= buf + 1 && *(p-1) != '\\') {
48704870
if (lc == c) {
48714871
lc = '\0';
48724872
} else if (lc != '\\') {
@@ -4893,7 +4893,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, uint8_t *stateptr, const
48934893

48944894
case '!':
48954895
/* JavaScript & Other HTML scripting languages */
4896-
if (state == 1 && *(p-1) == '<') {
4896+
if (state == 1 && p >= buf + 1 && *(p-1) == '<') {
48974897
state = 3;
48984898
lc = c;
48994899
} else {
@@ -4920,7 +4920,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, uint8_t *stateptr, const
49204920

49214921
case '?':
49224922

4923-
if (state == 1 && *(p-1) == '<') {
4923+
if (state == 1 && p >= buf + 1 && *(p-1) == '<') {
49244924
br=0;
49254925
state=2;
49264926
break;

ext/standard/tests/file/bug79099.phpt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--TEST--
2+
Bug #79099 (OOB read in php_strip_tags_ex)
3+
--FILE--
4+
<?php
5+
$stream = fopen('php://memory', 'w+');
6+
fputs($stream, "<?\n\"\n");
7+
rewind($stream);
8+
var_dump(fgetss($stream));
9+
var_dump(fgetss($stream));
10+
fclose($stream);
11+
12+
$stream = fopen('php://memory', 'w+');
13+
fputs($stream, "<\0\n!\n");
14+
rewind($stream);
15+
var_dump(fgetss($stream));
16+
var_dump(fgetss($stream));
17+
fclose($stream);
18+
19+
$stream = fopen('php://memory', 'w+');
20+
fputs($stream, "<\0\n?\n");
21+
rewind($stream);
22+
var_dump(fgetss($stream));
23+
var_dump(fgetss($stream));
24+
fclose($stream);
25+
?>
26+
--EXPECT--
27+
string(0) ""
28+
string(0) ""
29+
string(0) ""
30+
string(0) ""
31+
string(0) ""
32+
string(0) ""

0 commit comments

Comments
 (0)