[PATCH v2] untar: do not exit with error when created directory already exists (fixes #2413).
Gedare Bloom
gedare at rtems.org
Thu Sep 10 03:00:27 UTC 2015
Looks good. This should go on 4.11 and master? Someone can commit.
On Wed, Sep 9, 2015 at 6:09 PM, Pavel Pisa <pisa at 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
>
More information about the devel
mailing list