]> granicus.if.org Git - php/commitdiff
fix bug #30388 (rename across filesystems loses ownership and permission info)
authorAntony Dovgal <tony2001@php.net>
Wed, 27 Oct 2004 11:58:49 +0000 (11:58 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 27 Oct 2004 11:58:49 +0000 (11:58 +0000)
main/streams/plain_wrapper.c

index 1f48ea4469cb6a151356e3e18a8593b543fb7d66..a7f7088fc1655daf270ef00810760b6e2b7f4b05 100644 (file)
@@ -1021,10 +1021,33 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c
        if (ret == -1) {
 #ifdef EXDEV
                if (errno == EXDEV) {
+                       struct stat sb;
                        if (php_copy_file(url_from, url_to TSRMLS_CC) == SUCCESS) {
-                               VCWD_UNLINK(url_from);
-                               return 1;
+                               if (VCWD_STAT(url_from, &sb) == 0) {
+                                       if (VCWD_CHMOD(url_to, sb.st_mode)) {
+                                               if (errno == EPERM) {
+                                                       php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
+                                                       VCWD_UNLINK(url_from);
+                                                       return 1;
+                                               }
+                                               php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
+                                               return 0;
+                                       }
+                                       if (VCWD_CHOWN(url_to, sb.st_uid, sb.st_gid)) {
+                                               if (errno == EPERM) {
+                                                       php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
+                                                       VCWD_UNLINK(url_from);
+                                                       return 1;
+                                               }
+                                               php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
+                                               return 0;
+                                       }
+                                       VCWD_UNLINK(url_from);
+                                       return 1;
+                               }
                        }
+                       php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
+                       return 0;
                }
 #endif
                php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));