diff --git a/Zend/tests/gh7910.phpt b/Zend/tests/gh7910.phpt new file mode 100644 index 000000000000..63b2f77bf2a3 --- /dev/null +++ b/Zend/tests/gh7910.phpt @@ -0,0 +1,14 @@ +--TEST-- +GH-7910 (rename fails on Windows if the target is being executed) +--FILE-- + +--CLEAN-- + +--EXPECT-- +bool(true) diff --git a/Zend/zend.c b/Zend/zend.c index be7fa210fff7..ffb77554821f 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1795,6 +1795,7 @@ ZEND_API zend_result zend_execute_scripts(int type, zval *retval, int file_count if (file_handle->opened_path) { zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path); } + zend_stream_close(file_handle); if (op_array) { zend_execute(op_array, retval); zend_exception_restore(); diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c index ae2c734b09b4..8693d6aef610 100644 --- a/Zend/zend_stream.c +++ b/Zend/zend_stream.c @@ -210,6 +210,16 @@ ZEND_API zend_result zend_stream_fixup(zend_file_handle *file_handle, char **buf return SUCCESS; } /* }}} */ +/* Closes handle stream if opened by zend_stream_fixup() */ +ZEND_API void zend_stream_close(zend_file_handle *fh) /* {{{ */ +{ + if (fh->type == ZEND_HANDLE_STREAM && fh->handle.stream.handle + && fh->handle.stream.closer == (zend_stream_closer_t)zend_stream_stdio_closer) { + fh->handle.stream.closer(fh->handle.stream.handle); + fh->handle.stream.closer = NULL; + } +} /* }}} */ + static void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */ { switch (fh->type) { diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h index 047719e175a0..38e11a108e33 100644 --- a/Zend/zend_stream.h +++ b/Zend/zend_stream.h @@ -68,6 +68,7 @@ ZEND_API void zend_stream_init_filename(zend_file_handle *handle, const char *fi ZEND_API void zend_stream_init_filename_ex(zend_file_handle *handle, zend_string *filename); ZEND_API zend_result zend_stream_open(zend_file_handle *handle); ZEND_API zend_result zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len); +ZEND_API void zend_stream_close(zend_file_handle *handle); ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle); void zend_stream_init(void);