[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