OSDN Git Service

Open the source before creating the destination.
authorMatt Kraai <kraai@debian.org>
Tue, 11 Dec 2001 16:43:48 +0000 (16:43 -0000)
committerMatt Kraai <kraai@debian.org>
Tue, 11 Dec 2001 16:43:48 +0000 (16:43 -0000)
libbb/copy_file.c
testsuite/cp/cp-does-not-copy-unreadable-file [new file with mode: 0644]

index a80e30b..29778f2 100644 (file)
@@ -132,21 +132,30 @@ int copy_file(const char *source, const char *dest, int flags)
        } else if (S_ISREG(source_stat.st_mode)) {
                FILE *sfp, *dfp=NULL;
 
+               if ((sfp = fopen(source, "r")) == NULL) {
+                       perror_msg("unable to open `%s'", source);
+                       return -1;
+               }
+
                if (dest_exists) {
                        if (flags & FILEUTILS_INTERACTIVE) {
                                fprintf(stderr, "%s: overwrite `%s'? ", applet_name, dest);
-                               if (!ask_confirmation())
+                               if (!ask_confirmation()) {
+                                       fclose (sfp);
                                        return 0;
+                               }
                        }
 
                        if ((dfp = fopen(dest, "w")) == NULL) {
                                if (!(flags & FILEUTILS_FORCE)) {
                                        perror_msg("unable to open `%s'", dest);
+                                       fclose (sfp);
                                        return -1;
                                }
 
                                if (unlink(dest) < 0) {
                                        perror_msg("unable to remove `%s'", dest);
+                                       fclose (sfp);
                                        return -1;
                                }
 
@@ -162,17 +171,11 @@ int copy_file(const char *source, const char *dest, int flags)
                                if (fd >= 0)
                                        close(fd);
                                perror_msg("unable to open `%s'", dest);
+                               fclose (sfp);
                                return -1;
                        }
                }
 
-               if ((sfp = fopen(source, "r")) == NULL) {
-                       fclose(dfp);
-                       perror_msg("unable to open `%s'", source);
-                       status = -1;
-                       goto end;
-               }
-
                if (copy_file_chunk(sfp, dfp, -1) < 0)
                        status = -1;
 
diff --git a/testsuite/cp/cp-does-not-copy-unreadable-file b/testsuite/cp/cp-does-not-copy-unreadable-file
new file mode 100644 (file)
index 0000000..68c5767
--- /dev/null
@@ -0,0 +1,4 @@
+touch foo
+chmod a-r foo
+busybox cp foo bar
+test ! -f bar