Skip to content

Instantly share code, notes, and snippets.

@weltling
Last active March 27, 2019 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save weltling/e064dfbf2df2fd038df26f4cdb0edd74 to your computer and use it in GitHub Desktop.
Save weltling/e064dfbf2df2fd038df26f4cdb0edd74 to your computer and use it in GitHub Desktop.
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