Skip to content

Commit

Permalink
Fix stack underflow in phar
Browse files Browse the repository at this point in the history
The checks can issue reads below and above the temporary buffer. A read
itself doesn't seem dangerous, but the condition result can be
arbitrary. Such reads have to be avoided. Likely this patch should be
backported.

(cherry picked from commit b053bee)
  • Loading branch information
weltling committed Aug 30, 2018
1 parent c172927 commit 7fb7869
Showing 1 changed file with 7 additions and 10 deletions.
17 changes: 7 additions & 10 deletions ext/phar/phar.c
Original file line number Diff line number Diff line change
Expand Up @@ -1832,27 +1832,24 @@ static int phar_analyze_path(const char *fname, const char *ext, int ext_len, in
/* check for ".phar" in extension */
static int phar_check_str(const char *fname, const char *ext_str, int ext_len, int executable, int for_create) /* {{{ */
{
char test[51];
const char *pos;

if (ext_len < 0 || ext_len >= 50) {
return FAILURE;
}

if (executable == 1) {
/* copy "." as well */
memcpy(test, ext_str - 1, ext_len + 1);
test[ext_len + 1] = '\0';
/* executable phars must contain ".phar" as a valid extension (phar://.pharmy/oops is invalid) */
/* (phar://hi/there/.phar/oops is also invalid) */
pos = strstr(test, ".phar");
pos = strstr(ext_str, ".phar");

if (pos && (*(pos - 1) != '/')
&& (pos += 5) && (*pos == '\0' || *pos == '/' || *pos == '.')) {
return phar_analyze_path(fname, ext_str, ext_len, for_create);
} else {
if (!pos
|| pos != ext_str && (*(pos - 1) == '/')
|| (ext_len - (pos - ext_str)) < 5
|| !(pos += 5)
|| !(*pos == '\0' || *pos == '/' || *pos == '.')) {
return FAILURE;
}
return phar_analyze_path(fname, ext_str, ext_len, for_create);
}

/* data phars need only contain a single non-"." to be valid */
Expand Down

0 comments on commit 7fb7869

Please sign in to comment.