mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Merge branch 'PHP-5.6'
* PHP-5.6: Fix bug #65701: Do not use cache for file file copy
This commit is contained in:
commit
dd9c80e44b
4 changed files with 58 additions and 23 deletions
|
@ -1668,7 +1668,7 @@ PHPAPI int php_copy_file_ctx(const char *src, const char *dest, int src_flg, php
|
|||
return FAILURE;
|
||||
}
|
||||
|
||||
switch (php_stream_stat_path_ex(dest, PHP_STREAM_URL_STAT_QUIET, &dest_s, ctx)) {
|
||||
switch (php_stream_stat_path_ex(dest, PHP_STREAM_URL_STAT_QUIET | PHP_STREAM_URL_STAT_NOCACHE, &dest_s, ctx)) {
|
||||
case -1:
|
||||
/* non-statable stream */
|
||||
goto safe_to_copy;
|
||||
|
|
30
ext/standard/tests/file/bug65701.phpt
Normal file
30
ext/standard/tests/file/bug65701.phpt
Normal file
|
@ -0,0 +1,30 @@
|
|||
--TEST--
|
||||
Test for bug #65701: copy() doesn't work when destination filename is created by tempnam()
|
||||
--CREDITS--
|
||||
Boro Sitnikovski <buritomath@yahoo.com>
|
||||
--FILE--
|
||||
<?php
|
||||
$file_path = dirname(__FILE__) . "/bug65701/";
|
||||
|
||||
mkdir($file_path);
|
||||
|
||||
$src = $file_path . '/srcbug65701_file.txt';
|
||||
$dst = tempnam($file_path, 'dstbug65701_file.txt');
|
||||
|
||||
file_put_contents($src, "Hello World");
|
||||
|
||||
copy($src, $dst);
|
||||
var_dump(filesize($dst));
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
$file_path = dirname(__FILE__) . "/bug65701/";
|
||||
foreach (scandir($file_path) as $file) {
|
||||
if (strpos($file, "bug65701") !== false) {
|
||||
unlink($file_path . $file);
|
||||
}
|
||||
}
|
||||
rmdir($file_path);
|
||||
?>
|
||||
--EXPECT--
|
||||
int(11)
|
|
@ -373,6 +373,7 @@ END_EXTERN_C()
|
|||
/* Flags for url_stat method in wrapper ops */
|
||||
#define PHP_STREAM_URL_STAT_LINK 1
|
||||
#define PHP_STREAM_URL_STAT_QUIET 2
|
||||
#define PHP_STREAM_URL_STAT_NOCACHE 4
|
||||
|
||||
/* change the blocking mode of stream: value == 1 => blocking, value == 0 => non-blocking. */
|
||||
#define PHP_STREAM_OPTION_BLOCKING 1
|
||||
|
|
|
@ -1924,16 +1924,18 @@ PHPAPI int _php_stream_stat_path(const char *path, int flags, php_stream_statbuf
|
|||
const char *path_to_open = path;
|
||||
int ret;
|
||||
|
||||
/* Try to hit the cache first */
|
||||
if (flags & PHP_STREAM_URL_STAT_LINK) {
|
||||
if (BG(CurrentLStatFile) && strcmp(path, BG(CurrentLStatFile)) == 0) {
|
||||
memcpy(ssb, &BG(lssb), sizeof(php_stream_statbuf));
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (BG(CurrentStatFile) && strcmp(path, BG(CurrentStatFile)) == 0) {
|
||||
memcpy(ssb, &BG(ssb), sizeof(php_stream_statbuf));
|
||||
return 0;
|
||||
if (!(flags & PHP_STREAM_URL_STAT_NOCACHE)) {
|
||||
/* Try to hit the cache first */
|
||||
if (flags & PHP_STREAM_URL_STAT_LINK) {
|
||||
if (BG(CurrentLStatFile) && strcmp(path, BG(CurrentLStatFile)) == 0) {
|
||||
memcpy(ssb, &BG(lssb), sizeof(php_stream_statbuf));
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (BG(CurrentStatFile) && strcmp(path, BG(CurrentStatFile)) == 0) {
|
||||
memcpy(ssb, &BG(ssb), sizeof(php_stream_statbuf));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1941,19 +1943,21 @@ PHPAPI int _php_stream_stat_path(const char *path, int flags, php_stream_statbuf
|
|||
if (wrapper && wrapper->wops->url_stat) {
|
||||
ret = wrapper->wops->url_stat(wrapper, path_to_open, flags, ssb, context TSRMLS_CC);
|
||||
if (ret == 0) {
|
||||
/* Drop into cache */
|
||||
if (flags & PHP_STREAM_URL_STAT_LINK) {
|
||||
if (BG(CurrentLStatFile)) {
|
||||
efree(BG(CurrentLStatFile));
|
||||
if (!(flags & PHP_STREAM_URL_STAT_NOCACHE)) {
|
||||
/* Drop into cache */
|
||||
if (flags & PHP_STREAM_URL_STAT_LINK) {
|
||||
if (BG(CurrentLStatFile)) {
|
||||
efree(BG(CurrentLStatFile));
|
||||
}
|
||||
BG(CurrentLStatFile) = estrdup(path);
|
||||
memcpy(&BG(lssb), ssb, sizeof(php_stream_statbuf));
|
||||
} else {
|
||||
if (BG(CurrentStatFile)) {
|
||||
efree(BG(CurrentStatFile));
|
||||
}
|
||||
BG(CurrentStatFile) = estrdup(path);
|
||||
memcpy(&BG(ssb), ssb, sizeof(php_stream_statbuf));
|
||||
}
|
||||
BG(CurrentLStatFile) = estrdup(path);
|
||||
memcpy(&BG(lssb), ssb, sizeof(php_stream_statbuf));
|
||||
} else {
|
||||
if (BG(CurrentStatFile)) {
|
||||
efree(BG(CurrentStatFile));
|
||||
}
|
||||
BG(CurrentStatFile) = estrdup(path);
|
||||
memcpy(&BG(ssb), ssb, sizeof(php_stream_statbuf));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue