From: Antony Dovgal Date: Wed, 27 Oct 2004 12:01:20 +0000 (+0000) Subject: MFH: fix bug #30388 (rename across filesystems loses ownership and permission info) X-Git-Tag: php-4.3.10RC1~38 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e4fadfcd8914bbbee5546c0e64529ebc021e554c;p=php MFH: fix bug #30388 (rename across filesystems loses ownership and permission info) --- diff --git a/ext/standard/file.c b/ext/standard/file.c index 86230d1567..58a9a3158a 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1914,9 +1914,30 @@ PHP_FUNCTION(rename) if (ret == -1) { #ifdef EXDEV if (errno == EXDEV) { - if (php_copy_file(old_name, new_name TSRMLS_CC) == SUCCESS) { - VCWD_UNLINK(old_name); - RETURN_TRUE; + struct stat sb; + if (php_copy_file(old_name, new_name TSRMLS_CC) == SUCCESS) { + if (VCWD_STAT(old_name, &sb) == 0) { + if (VCWD_CHMOD(new_name, sb.st_mode)) { + if (errno == EPERM) { + php_error_docref2(NULL TSRMLS_CC, old_name, new_name, E_WARNING, "%s", strerror(errno)); + VCWD_UNLINK(old_name); + RETURN_TRUE; + } + php_error_docref2(NULL TSRMLS_CC, old_name, new_name, E_WARNING, "%s", strerror(errno)); + RETURN_FALSE; + } + if (VCWD_CHOWN(new_name, sb.st_uid, sb.st_gid)) { + if (errno == EPERM) { + php_error_docref2(NULL TSRMLS_CC, old_name, new_name, E_WARNING, "%s", strerror(errno)); + VCWD_UNLINK(old_name); + RETURN_TRUE; + } + php_error_docref2(NULL TSRMLS_CC, old_name, new_name, E_WARNING, "%s", strerror(errno)); + RETURN_FALSE; + } + VCWD_UNLINK(old_name); + RETURN_TRUE; + } } } #endif