[PATCH v2] untar: do not exit with error when created directory already exists (fixes #2413).
Pavel Pisa
pisa at cmp.felk.cvut.cz
Wed Sep 9 22:09:17 UTC 2015
The problem exists for both RTEMS untar implementations and their
variants: Untar_FromMemory(), Untar_FromFile() and rtems_tarfs_load().
---
cpukit/libfs/src/imfs/imfs_load_tar.c | 12 +++++++++++-
cpukit/libmisc/untar/untar.c | 18 +++++++++++++++++-
2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/cpukit/libfs/src/imfs/imfs_load_tar.c b/cpukit/libfs/src/imfs/imfs_load_tar.c
index 7228978..2d4ca6b 100644
--- a/cpukit/libfs/src/imfs/imfs_load_tar.c
+++ b/cpukit/libfs/src/imfs/imfs_load_tar.c
@@ -103,8 +103,18 @@ int rtems_tarfs_load(
strcat(full_filename, "/");
++len;
strncat(full_filename, filename, 256-len-1);
- rv = mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
+ if ( mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO) != 0 ) {
+ if (errno == EEXIST) {
+ struct stat stat_buf;
+ if ( stat(full_filename, &stat_buf) == 0 ) {
+ if ( S_ISDIR(stat_buf.st_mode) )
+ continue;
+ }
+ }
+ rv = -1;
+ }
}
+
/*
* Create a LINEAR_FILE node
*/
diff --git a/cpukit/libmisc/untar/untar.c b/cpukit/libmisc/untar/untar.c
index aed8fed..2c1e304 100644
--- a/cpukit/libmisc/untar/untar.c
+++ b/cpukit/libmisc/untar/untar.c
@@ -28,6 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <rtems/untar.h>
@@ -203,6 +204,13 @@ Untar_FromMemory(
}
} else if (linkflag == DIRTYPE) {
if ( mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO) != 0 ) {
+ if (errno == EEXIST) {
+ struct stat stat_buf;
+ if ( stat(fname, &stat_buf) == 0 ) {
+ if ( S_ISDIR(stat_buf.st_mode) )
+ continue;
+ }
+ }
printk("Untar: failed to create directory %s\n", fname);
retval = UNTAR_FAIL;
break;
@@ -319,7 +327,15 @@ Untar_FromFile(
close(out_fd);
}
} else if (linkflag == DIRTYPE) {
- (void) mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO);
+ if ( mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO) != 0 ) {
+ if (errno == EEXIST) {
+ struct stat stat_buf;
+ if ( stat(fname, &stat_buf) == 0 ) {
+ if ( S_ISDIR(stat_buf.st_mode) )
+ continue;
+ }
+ }
+ }
}
}
free(bufr);
--
1.9.1
More information about the devel
mailing list