Last active
March 27, 2019 10:34
-
-
Save weltling/e064dfbf2df2fd038df26f4cdb0edd74 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c | |
index 87483417eb..b75e4a900c 100644 | |
--- a/ext/phar/phar_object.c | |
+++ b/ext/phar/phar_object.c | |
@@ -447,6 +447,11 @@ PHP_METHOD(Phar, mount) | |
fname_len = strlen(fname); | |
#ifdef PHP_WIN32 | |
+ char cur_fname[PHP_WIN32_IOUTIL_MAXPATHLEN]; | |
+ fname_len = PHP_WIN32_IOUTIL_MAXPATHLEN - 1 < fname_len ? PHP_WIN32_IOUTIL_MAXPATHLEN - 1 : fname_len; | |
+ memcpy(cur_fname, fname, fname_len); | |
+ cur_fname[fname_len] = '\0'; | |
+ fname = &cur_fname; | |
phar_unixify_path_separators(fname, fname_len); | |
#endif | |
@@ -3625,6 +3630,21 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, size_t file | |
} | |
} | |
+#ifdef PHP_WIN32 | |
+ char cur_fname[PHP_WIN32_IOUTIL_MAXPATHLEN]; | |
+ char *cur_fname_p = NULL; | |
+ if (EXPECTED(PHP_WIN32_IOUTIL_MAXPATHLEN - 1 >= filename_len)) { | |
+ memcpy(cur_fname, filename, filename_len); | |
+ cur_fname[filename_len] = '\0'; | |
+ filename = &cur_fname; | |
+ } else { | |
+ cur_fname_p = emalloc((filename_len + 1) * sizeof(char)); | |
+ memcpy(cur_fname_p, filename, filename_len); | |
+ cur_fname_p[filename_len] = '\0'; | |
+ filename = cur_fname_p; | |
+ } | |
+#endif | |
+ | |
if (!(data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, filename, filename_len, "w+b", 0, &error, 1))) { | |
if (error) { | |
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist and cannot be created: %s", filename, error); | |
@@ -3632,6 +3652,11 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, size_t file | |
} else { | |
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist and cannot be created", filename); | |
} | |
+#ifdef PHP_WIN32 | |
+ if (UNEXPECTED(cur_fname_p)) { | |
+ efree(cur_fname_p); | |
+ } | |
+#endif | |
return; | |
} else { | |
if (error) { | |
@@ -3643,11 +3668,21 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, size_t file | |
contents_len = php_stream_write(data->fp, cont_str, cont_len); | |
if (contents_len != cont_len) { | |
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s could not be written to", filename); | |
+#ifdef PHP_WIN32 | |
+ if (UNEXPECTED(cur_fname_p)) { | |
+ efree(cur_fname_p); | |
+ } | |
+#endif | |
return; | |
} | |
} else { | |
if (!(php_stream_from_zval_no_verify(contents_file, zresource))) { | |
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s could not be written to", filename); | |
+#ifdef PHP_WIN32 | |
+ if (UNEXPECTED(cur_fname_p)) { | |
+ efree(cur_fname_p); | |
+ } | |
+#endif | |
return; | |
} | |
php_stream_copy_to_stream_ex(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len); | |
@@ -3655,6 +3690,14 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, size_t file | |
data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len; | |
} | |
+ | |
+#ifdef PHP_WIN32 | |
+ if (UNEXPECTED(cur_fname_p)) { | |
+ /* Ensure filename is not used anymore after this pount. */ | |
+ efree(cur_fname_p); | |
+ } | |
+#endif | |
+ | |
if (contents_file != NULL && php_stream_stat(contents_file, &ssb) != -1) { | |
data->internal_file->flags = ssb.sb.st_mode & PHAR_ENT_PERM_MASK ; | |
} else { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment