Looks good. This should go on 4.11 and master? Someone can commit.
On Wed, Sep 9, 2015 at 6:09 PM, Pavel Pisa <p...@cmp.felk.cvut.cz> wrote: > 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 > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel