From 43c7e6fa3b49eec31de7211a7b2b686ee5514102 Mon Sep 17 00:00:00 2001 From: Greg Beaver Date: Tue, 20 Nov 2007 05:34:35 +0000 Subject: [PATCH] fix faulty logic on verification of phar --- ext/phar/phar.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 4dec04113b..7bfc93375b 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -772,14 +772,23 @@ static int phar_open_loaded(char *fname, int fname_len, char *alias, int alias_l *error = NULL; } if (SUCCESS == phar_get_archive(&phar, fname, fname_len, alias, alias_len, error TSRMLS_CC) - && fname_len == phar->fname_len - && !strncmp(fname, phar->fname, fname_len) + && ((alias && fname_len == phar->fname_len + && !strncmp(fname, phar->fname, fname_len)) || !alias) ) { + /* logic above is as follows: + If an explicit alias was requested, ensure the filename passed in + matches the phar's filename. + If no alias was passed in, then it can match either and be valid + */ if (pphar) { *pphar = phar; } return SUCCESS; } else { + if (phar) { + printf("new %s\n", phar->fname); + printf("old %s\n", fname); + } if (pphar) { *pphar = NULL; } @@ -1507,6 +1516,9 @@ int phar_detect_phar_fname_ext(const char *filename, int check_length, char **ex *ext_str = pos_p; *ext_len = 5; } else { + /* We have an alias with no extension, so locate the first / and fail */ + *ext_str = strstr(filename, "/"); + *ext_len = -1; return FAILURE; } if (check_length && (*ext_str)[*ext_len] != '\0') { @@ -1542,8 +1554,13 @@ int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_le filename_len -= 7; } + ext_len = 0; if (phar_detect_phar_fname_ext(filename, 0, &ext_str, &ext_len) == FAILURE) { - return FAILURE; + if (ext_len != -1) { + return FAILURE; + } + ext_len = 0; + /* no extension detected - instead we are dealing with an alias */ } *arch_len = ext_str - filename + ext_len; -- 2.50.1