Changeset b0f08c8 in rtems


Ignore:
Timestamp:
Aug 1, 2016, 1:02:13 AM (3 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
21d73655
Parents:
5d0f0de4
git-author:
Chris Johns <chrisj@…> (08/01/16 01:02:13)
git-committer:
Chris Johns <chrisj@…> (08/09/16 07:22:26)
Message:

libmisc/untar: Set the perms to the value in the tar file.

This patch parses the mode field in the tar header and sets the
directory or file to the mode value in the header.

Closes #2768.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libmisc/untar/untar.c

    r5d0f0de4 rb0f08c8  
    251251  const char          *bufr,
    252252  char                *fname,
     253  unsigned long       *mode,
    253254  unsigned long       *file_size,
    254255  unsigned long       *nblocks,
     
    286287  strncpy(fname, bufr, MAX_NAME_FIELD_SIZE);
    287288  fname[MAX_NAME_FIELD_SIZE] = '\0';
     289
     290  *mode = strtoul(&bufr[100], NULL, 8);
    288291
    289292  *linkflag   = bufr[156];
     
    300303    symlink(linkname, fname);
    301304  } else if (*linkflag == REGTYPE) {
    302     rtems_printf(printer, "untar: file: %s (%i)\n", fname, (int) *file_size);
     305    rtems_printf(printer, "untar: file: %s (s:%i,m:%04o)\n",
     306                 fname, (int) *file_size, (int) *mode);
    303307    *nblocks = (((*file_size) + 511) & ~511) / 512;
    304308    if (Make_Path(printer, fname, false) < 0) {
     
    319323            r = unlink(fname);
    320324            if (r == 0) {
    321               r = mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO);
     325              r = mkdir(fname, *mode);
    322326            }
    323327          }
     
    363367)
    364368{
    365   FILE           *fp;
     369  int            fd;
    366370  const char     *tar_ptr = (const char *)tar_buf;
    367371  const char     *bufr;
     
    369373  int            retval = UNTAR_SUCCESSFUL;
    370374  unsigned long  ptr;
    371   unsigned long  nblocks;
    372   unsigned long  file_size;
    373   unsigned char  linkflag;
     375  unsigned long  nblocks = 0;
     376  unsigned long  file_size = 0;
     377  unsigned long  mode = 0;
     378  unsigned char  linkflag = 0;
    374379
    375380  rtems_printf(printer, "untar: memory at %p (%zu)\n", tar_buf, size);
     
    386391    ptr += 512;
    387392
    388     retval = Untar_ProcessHeader(bufr, fname, &file_size, &nblocks, &linkflag, printer);
     393    retval = Untar_ProcessHeader(bufr, fname, &mode, &file_size,
     394                                 &nblocks, &linkflag, printer);
    389395
    390396    if (retval != UNTAR_SUCCESSFUL)
     
    392398
    393399    if (linkflag == REGTYPE) {
    394       if ((fp = fopen(fname, "w")) == NULL) {
     400      if ((fd = open(fname, O_TRUNC | O_CREAT | O_WRONLY, mode)) == -1) {
    395401        Print_Error(printer, "open", fname);
    396402        ptr += 512 * nblocks;
    397403      } else {
    398404        unsigned long sizeToGo = file_size;
    399         size_t        len;
    400         size_t        i;
    401         size_t        n;
     405        ssize_t       len;
     406        ssize_t       i;
     407        ssize_t       n;
    402408
    403409        /*
     
    407413        for (i = 0; i < nblocks; i++) {
    408414          len = ((sizeToGo < 512L) ? (sizeToGo) : (512L));
    409           n = fwrite(&tar_ptr[ptr], 1, len, fp);
     415          n = write(fd, &tar_ptr[ptr], len);
    410416          if (n != len) {
    411417            Print_Error(printer, "write", fname);
     
    416422          sizeToGo -= n;
    417423        }
    418         fclose(fp);
     424        close(fd);
    419425      }
    420426
     
    486492  int            retval;
    487493  unsigned long  i;
    488   unsigned long  nblocks;
    489   unsigned long  file_size;
    490   unsigned char  linkflag;
     494  unsigned long  nblocks = 0;
     495  unsigned long  file_size = 0;
     496  unsigned long  mode = 0;
     497  unsigned char  linkflag = 0;
    491498
    492499  retval = UNTAR_SUCCESSFUL;
     
    509516    }
    510517
    511     retval = Untar_ProcessHeader(bufr, fname, &file_size, &nblocks, &linkflag, printer);
     518    retval = Untar_ProcessHeader(bufr, fname, &mode, &file_size,
     519                                 &nblocks, &linkflag, printer);
    512520
    513521    if (retval != UNTAR_SUCCESSFUL)
     
    522530       */
    523531
    524       if ((out_fd = creat(fname, 0644)) == -1) {
     532      if ((out_fd = creat(fname, mode)) == -1) {
    525533        (void) lseek(fd, SEEK_CUR, 512UL * nblocks);
    526534      } else {
     
    580588            &context->header[0],
    581589            &context->fname[0],
     590            &context->mode,
    582591            &context->todo_bytes,
    583592            &context->todo_blocks,
     
    592601
    593602          if (linkflag == REGTYPE) {
    594             context->out_fd = creat(&context->fname[0], 0644);
     603            context->out_fd = creat(&context->fname[0], context->mode);
    595604
    596605            if (context->out_fd >= 0) {
  • cpukit/libmisc/untar/untar.h

    r5d0f0de4 rb0f08c8  
    7575
    7676  /**
     77   * @brief Mode of the file.
     78   */
     79  unsigned long mode;
     80
     81  /**
    7782   * @brief Overall amount of bytes to be processed.
    7883   */
    79   long unsigned todo_bytes;
     84  unsigned long todo_bytes;
    8085
    8186  /**
  • testsuites/libtests/tar01/Makefile.am

    r5d0f0de4 rb0f08c8  
    1010
    1111tar01_LDADD = -lrtemscpu -lz
    12  
     12
    1313BUILT_SOURCES =
    1414BUILT_SOURCES += initial_filesystem_tar.c
     
    5858        (echo "This is a test of loading an RTEMS filesystem from an" ; \
    5959        echo "initial tar image.") >initial_fs/home/test_file
     60        (echo "#! joel" ; \
     61        echo "ls -las /dev") >initial_fs/home/test_script
     62        chmod +x initial_fs/home/test_script
    6063        (cd initial_fs; \
    6164        $(LN_S) home/test_file symlink; \
  • testsuites/libtests/tar01/init.c

    r5d0f0de4 rb0f08c8  
    4747);
    4848
     49static void test_untar_check_mode(const char* file, int mode)
     50{
     51  struct stat sb;
     52  int         fmode;
     53  rtems_test_assert(stat(file, &sb) == 0);
     54  fmode = sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
     55  printf(" %s: mode: %04o want: %04o\n", file, fmode, mode);
     56  rtems_test_assert(fmode == mode);
     57}
     58
    4959void test_untar_from_memory(void)
    5060{
     
    6575  printf( "========= /home/test_file =========\n" );
    6676  test_cat( "/home/test_file", 0, 0 );
     77
     78  /******************/
     79  printf( "========= /home/test_script =========\n" );
     80  test_cat( "/home/test_script", 0, 0 );
     81  test_untar_check_mode("/home/test_script", 0755);
    6782
    6883  /******************/
     
    108123
    109124  /******************/
     125  printf( "========= /dest/home/test_script =========\n" );
     126  test_cat( "/dest/home/test_script", 0, 0 );
     127  test_untar_check_mode("/dest/home/test_script", 0755);
     128
     129  /******************/
    110130  printf( "========= /dest/symlink =========\n" );
    111131  test_cat( "/dest/symlink", 0, 0 );
     
    145165
    146166  /******************/
     167  printf( "========= /dest2/home/test_script =========\n" );
     168  test_cat( "/dest2/home/test_script", 0, 0 );
     169  test_untar_check_mode("/dest2/home/test_script", 0755);
     170
     171  /******************/
    147172  printf( "========= /dest2/symlink =========\n" );
    148173  test_cat( "/dest2/symlink", 0, 0 );
     
    185210
    186211  /******************/
     212  printf( "========= /dest3/home/test_script =========\n" );
     213  test_cat( "/dest3/home/test_script", 0, 0 );
     214  test_untar_check_mode("/dest3/home/test_script", 0755);
     215
     216  /******************/
    187217  printf( "========= /dest3/symlink =========\n" );
    188218  test_cat( "/dest3/symlink", 0, 0 );
Note: See TracChangeset for help on using the changeset viewer.