Commit 2236e6b6c0e for php.net

commit 2236e6b6c0ed1655276bbaf3ba992fd7ddc435fe
Author: Gina Peter Banyard <girgias@php.net>
Date:   Sun Jul 19 15:17:24 2026 +0100

    stream: remove php_stream_fopen_with_path() function (#22793)

    It is unused as shown by the following Sourcegraph searches:
    - https://sourcegraph.com/search?q=context:global+_php_stream_fopen_with_path+-f:plain_wrapper.c+-:php_streams.h&patternType=keyword&sm=0
    - https://sourcegraph.com/search?q=context:global+php_stream_fopen_with_path+-f:plain_wrapper.c+-:php_streams.h&patternType=keyword&sm=0

diff --git a/main/streams/php_stream_plain_wrapper.h b/main/streams/php_stream_plain_wrapper.h
index f44edcb16a9..aa74859c11e 100644
--- a/main/streams/php_stream_plain_wrapper.h
+++ b/main/streams/php_stream_plain_wrapper.h
@@ -24,9 +24,6 @@ BEGIN_EXTERN_C()
 PHPAPI php_stream *_php_stream_fopen(const char *filename, const char *mode, zend_string **opened_path, int options STREAMS_DC);
 #define php_stream_fopen(filename, mode, opened)	_php_stream_fopen((filename), (mode), (opened), 0 STREAMS_CC)

-PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char *mode, const char *path, zend_string **opened_path, int options STREAMS_DC);
-#define php_stream_fopen_with_path(filename, mode, path, opened)	_php_stream_fopen_with_path((filename), (mode), (path), (opened), 0 STREAMS_CC)
-
 PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STREAMS_DC);
 #define php_stream_fopen_from_file(file, mode)	_php_stream_fopen_from_file((file), (mode) STREAMS_CC)

diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index 9289b6b5ec6..e0fda0db78a 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -1706,148 +1706,3 @@ PHPAPI /*const*/ php_stream_wrapper php_plain_files_wrapper = {
 	NULL,
 	0
 };
-
-/* {{{ php_stream_fopen_with_path */
-PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char *mode, const char *path, zend_string **opened_path, int options STREAMS_DC)
-{
-	/* code ripped off from fopen_wrappers.c */
-	char *pathbuf, *end;
-	const char *ptr;
-	char trypath[MAXPATHLEN];
-	php_stream *stream;
-	size_t filename_length;
-	zend_string *exec_filename;
-
-	if (opened_path) {
-		*opened_path = NULL;
-	}
-
-	if(!filename) {
-		return NULL;
-	}
-
-	filename_length = strlen(filename);
-#ifndef PHP_WIN32
-	(void) filename_length;
-#endif
-
-	/* Relative path open */
-	if (*filename == '.' && (IS_SLASH(filename[1]) || filename[1] == '.')) {
-		/* further checks, we could have ....... filenames */
-		ptr = filename + 1;
-		if (*ptr == '.') {
-			while (*(++ptr) == '.');
-			if (!IS_SLASH(*ptr)) { /* not a relative path after all */
-				goto not_relative_path;
-			}
-		}
-
-
-		if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(filename)) {
-			return NULL;
-		}
-
-		return php_stream_fopen_rel(filename, mode, opened_path, options);
-	}
-
-not_relative_path:
-
-	/* Absolute path open */
-	if (IS_ABSOLUTE_PATH(filename, filename_length)) {
-
-		if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(filename)) {
-			return NULL;
-		}
-
-		return php_stream_fopen_rel(filename, mode, opened_path, options);
-	}
-
-#ifdef PHP_WIN32
-	if (IS_SLASH(filename[0])) {
-		size_t cwd_len;
-		char *cwd;
-		cwd = virtual_getcwd_ex(&cwd_len);
-		/* getcwd() will return always return [DRIVE_LETTER]:/) on windows. */
-		*(cwd+3) = '\0';
-
-		if (snprintf(trypath, MAXPATHLEN, "%s%s", cwd, filename) >= MAXPATHLEN) {
-			php_stream_wrapper_notice(NULL, NULL, REPORT_ERRORS,
-					PathTooLong,
-					"%s/%s path was truncated to %d", cwd, filename, MAXPATHLEN);
-		}
-
-		efree(cwd);
-
-		if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(trypath)) {
-			return NULL;
-		}
-
-		return php_stream_fopen_rel(trypath, mode, opened_path, options);
-	}
-#endif
-
-	if (!path || !*path) {
-		return php_stream_fopen_rel(filename, mode, opened_path, options);
-	}
-
-	/* check in provided path */
-	/* append the calling scripts' current working directory
-	 * as a fallback case
-	 */
-	if (zend_is_executing() &&
-	    (exec_filename = zend_get_executed_filename_ex()) != NULL) {
-		const char *exec_fname = ZSTR_VAL(exec_filename);
-		size_t exec_fname_length = ZSTR_LEN(exec_filename);
-
-		while ((--exec_fname_length < SIZE_MAX) && !IS_SLASH(exec_fname[exec_fname_length]));
-		if (exec_fname_length<=0) {
-			/* no path */
-			pathbuf = estrdup(path);
-		} else {
-			size_t path_length = strlen(path);
-
-			pathbuf = (char *) emalloc(exec_fname_length + path_length +1 +1);
-			memcpy(pathbuf, path, path_length);
-			pathbuf[path_length] = DEFAULT_DIR_SEPARATOR;
-			memcpy(pathbuf+path_length+1, exec_fname, exec_fname_length);
-			pathbuf[path_length + exec_fname_length +1] = '\0';
-		}
-	} else {
-		pathbuf = estrdup(path);
-	}
-
-	ptr = pathbuf;
-
-	while (ptr && *ptr) {
-		end = (char *) strchr(ptr, DEFAULT_DIR_SEPARATOR);
-		if (end != NULL) {
-			*end = '\0';
-			end++;
-		}
-		if (*ptr == '\0') {
-			goto stream_skip;
-		}
-		if (snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename) >= MAXPATHLEN) {
-			php_stream_wrapper_notice(NULL, NULL, REPORT_ERRORS,
-					PathTooLong,
-					"%s/%s path was truncated to %d", ptr, filename, MAXPATHLEN);
-		}
-
-		if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir_ex(trypath, 0)) {
-			goto stream_skip;
-		}
-
-		stream = php_stream_fopen_rel(trypath, mode, opened_path, options);
-		if (stream) {
-			efree(pathbuf);
-			return stream;
-		}
-stream_skip:
-		ptr = end;
-	} /* end provided path */
-
-	efree(pathbuf);
-	return NULL;
-
-}
-/* }}} */