aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbb/copy_file.c19
-rw-r--r--testsuite/cp/cp-does-not-copy-unreadable-file4
2 files changed, 15 insertions, 8 deletions
diff --git a/libbb/copy_file.c b/libbb/copy_file.c
index a80e30b50..29778f2a4 100644
--- a/libbb/copy_file.c
+++ b/libbb/copy_file.c
@@ -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
index 000000000..68c576727
--- /dev/null
+++ b/testsuite/cp/cp-does-not-copy-unreadable-file
@@ -0,0 +1,4 @@
+touch foo
+chmod a-r foo
+busybox cp foo bar
+test ! -f bar