Commit 605ff6e11bc for php.net
commit 605ff6e11bc94b4bb35211827b39358910c9242d
Author: Gina Peter Banyard <girgias@php.net>
Date: Tue Jul 21 00:39:19 2026 +0100
streams: use common cleanup code in _php_stream_open_wrapper_ex()
diff --git a/main/streams/streams.c b/main/streams/streams.c
index 506a23b3bf7..192689ce036 100644
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -2108,10 +2108,7 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
options &= ~USE_PATH;
}
if (EG(exception)) {
- if (resolved_path) {
- zend_string_release_ex(resolved_path, false);
- }
- return NULL;
+ goto cleanup_no_wrapper_name;
}
}
@@ -2121,28 +2118,19 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
if (UNEXPECTED(!wrapper)) {
php_stream_wrapper_warn_name(PHP_STREAM_ERROR_WRAPPER_DEFAULT_NAME, context, options, OpenFailed,
"Failed to open stream: no suitable wrapper could be found");
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- return NULL;
+ goto cleanup_no_wrapper_name;
}
if ((options & STREAM_USE_URL) && !wrapper->is_url) {
php_stream_wrapper_warn(wrapper, context, options,
ProtocolUnsupported,
"This function may only be used against URLs");
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- return NULL;
+ goto cleanup_no_wrapper_name;
}
if (!wrapper->wops->stream_opener) {
php_stream_wrapper_warn(wrapper, context, options, NoOpener,
"Failed to open stream: wrapper does not support stream open");
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- return NULL;
+ goto cleanup_no_wrapper_name;
}
/* wrapper name needs to be stored as wrapper can be removed in opener (user stream) */
@@ -2155,17 +2143,9 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
if (options & REPORT_ERRORS) {
php_stream_display_wrapper_name_errors(wrapper_name, context, PHP_STREAM_EC(OpenFailed),
"Failed to open stream");
- if (opened_path && *opened_path) {
- zend_string_release_ex(*opened_path, 0);
- *opened_path = NULL;
- }
}
php_stream_tidy_wrapper_name_error_log(wrapper_name);
- pefree(wrapper_name, persistent);
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- return NULL;
+ goto cleanup;
}
/* if the caller asked for a persistent stream but the wrapper did not
@@ -2174,17 +2154,8 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
php_stream_wrapper_warn(wrapper, context, options, PersistentNotSupported,
"Failed to open stream: wrapper does not support persistent streams");
php_stream_close(stream);
- if (options & REPORT_ERRORS) {
- if (opened_path && *opened_path) {
- zend_string_release_ex(*opened_path, 0);
- *opened_path = NULL;
- }
- }
- pefree(wrapper_name, persistent);
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- return NULL;
+ stream = NULL;
+ goto cleanup;
}
stream->wrapper = wrapper;
@@ -2217,31 +2188,21 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
(options & STREAM_WILL_CAST)
? PHP_STREAM_PREFER_STDIO : PHP_STREAM_NO_PREFERENCE)) {
case PHP_STREAM_UNCHANGED:
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- pefree(wrapper_name, persistent);
- return stream;
+ goto cleanup;
case PHP_STREAM_RELEASED:
if (newstream->orig_path) {
pefree(newstream->orig_path, persistent);
}
newstream->orig_path = pestrdup(path, persistent);
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- pefree(wrapper_name, persistent);
- return newstream;
+ stream = newstream;
+ goto cleanup;
default:
- php_stream_close(stream);
php_stream_wrapper_warn(wrapper, context, options,
SeekNotSupported,
"could not make seekable - %s", path);
- pefree(wrapper_name, persistent);
- if (resolved_path) {
- zend_string_release_ex(resolved_path, 0);
- }
- return NULL;
+ php_stream_close(stream);
+ stream = NULL;
+ goto cleanup;
}
}
@@ -2254,10 +2215,18 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
}
}
+cleanup:
pefree(wrapper_name, persistent);
+cleanup_no_wrapper_name:
if (resolved_path) {
zend_string_release_ex(resolved_path, 0);
}
+ if (stream == NULL) {
+ if (opened_path && *opened_path) {
+ zend_string_release_ex(*opened_path, 0);
+ *opened_path = NULL;
+ }
+ }
return stream;
}
/* }}} */