Re: svn commit: r309300 - in head: contrib/libarchive contrib/libarchive/libarchive contrib/libarchive/libarchive/test contrib/libarchive/tar/test lib/libarchive/tests

2016-12-01 Thread Cy Schubert
In message <201612020225.ub22piql039...@slippy.cwsent.com>, Cy Schubert 
writes:
> In message <201611292214.uatmegqh079...@repo.freebsd.org>, Martin Matuska 
> write
> s:
> > Author: mm
> > Date: Tue Nov 29 22:14:42 2016
> > New Revision: 309300
> > URL: https://svnweb.freebsd.org/changeset/base/309300
> > 
> > Log:
> >   MFV r309299:
> >   Sync libarchive with vendor.
> >   
> >   Important vendor bugfixes (relevant to FreeBSD):
> >   #821: tar -P cannot extract hardlinks through symlinks
> >   #825: Add sanity check of tar "uid, "gid" and "mtime" fields
> >   
> >   PR:   213255
> >   Reported by:  Tijl Coosemans 
> >   MFC after:1 week
> > 
> > Added:
> >   head/contrib/libarchive/libarchive/test/test_compat_gtar_2.tar.uu
> >  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/tes
> t/
> > test_compat_gtar_2.tar.uu
> >   head/contrib/libarchive/libarchive/test/test_compat_star_acl_posix1e.c
> >  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/tes
> t/
> > test_compat_star_acl_posix1e.c
> >   head/contrib/libarchive/libarchive/test/test_compat_star_acl_posix1e.tar.
> uu
> >  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/tes
> t/
> > test_compat_star_acl_posix1e.tar.uu
> >   head/contrib/libarchive/libarchive/test/test_read_format_raw.bufr.uu
> >  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/tes
> t/
> > test_read_format_raw.bufr.uu
> > Modified:
> >   head/contrib/libarchive/NEWS
> >   head/contrib/libarchive/libarchive/archive_acl.c
> >   head/contrib/libarchive/libarchive/archive_entry.c
> >   head/contrib/libarchive/libarchive/archive_entry.h
> >   head/contrib/libarchive/libarchive/archive_entry_acl.3
> >   head/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
> >   head/contrib/libarchive/libarchive/archive_read_support_filter_xz.c
> >   head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
> >   head/contrib/libarchive/libarchive/archive_read_support_format_xar.c
> >   head/contrib/libarchive/libarchive/archive_write_disk_posix.c
> >   head/contrib/libarchive/libarchive/test/test_compat_gtar.c
> >   head/contrib/libarchive/libarchive/test/test_read_format_raw.c
> >   head/contrib/libarchive/libarchive/test/test_sparse_basic.c
> >   head/contrib/libarchive/tar/test/test_symlink_dir.c
> >   head/lib/libarchive/tests/Makefile
> > Directory Properties:
> >   head/contrib/libarchive/   (props changed)
> > 
> [...]
> > Modified: head/contrib/libarchive/libarchive/archive_read_support_format_ta
> r.
> > c
> > ===
> ==
> > =
> > --- head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
> > Tue Nov 29 21:53:16 2016(r309299)
> > +++ head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
> > Tue Nov 29 22:14:42 2016(r309300)
> > @@ -294,6 +294,46 @@ archive_read_format_tar_cleanup(struct a
> > return (ARCHIVE_OK);
> >  }
> >  
> > +static int
> > +validate_number_field(const char* p_field, size_t i_size)
> > +{
> > +   unsigned char marker = (unsigned char)p_field[0];
> > +   /* octal? */
> > +   if ((marker >= '0' && marker <= '7') || marker == ' ') {
> > +   size_t i = 0;
> > +   int octal_found = 0;
> > +   for (i = 0; i < i_size; ++i) {
> > +   switch (p_field[i])
> > +   {
> > +   case ' ': /* skip any leading spaces and trailing space
> > */
> > +   if (octal_found == 0 || i == i_size - 1) {
> > +   continue;
> > +   }
> > +   break;
> > +   case '\0': /* null is allowed only at the end */
> > +   if (i != i_size - 1) {
> > +   return 0;
> > +   }
> > +   break;
> > +   /* rest must be octal digits */
> > +   case '0': case '1': case '2': case '3':
> > +   case '4': case '5': case '6': case '7':
> > +   ++octal_found;
> > +   break;
> > +   }
> > +   }
> > +   return octal_found > 0;
> > +   }
> > +   /* base 256 (i.e. binary number) */
> > +   else if (marker == 128 || marker == 255 || marker == 0) {
> > +   /* nothing to check */
> > +   return 1;
> > +   }
> > +   /* not a number field */
> > +   else {
> > +   return 0;
> > +   }
> > +}
> >  
> >  static int
> >  archive_read_format_tar_bid(struct archive_read *a, int best_bid)
> > @@ -346,23 +386,23 @@ archive_read_format_tar_bid(struct archi
> > return (0);
> > bid += 2;  /* 6 bits of variation in an 8-bit field leaves 2 bits. */
> >  
> > -   /* Sanity check: Look at first byte of mode field. */
> > -   switch (255 & 

Re: svn commit: r309300 - in head: contrib/libarchive contrib/libarchive/libarchive contrib/libarchive/libarchive/test contrib/libarchive/tar/test lib/libarchive/tests

2016-12-01 Thread Cy Schubert
In message <201611292214.uatmegqh079...@repo.freebsd.org>, Martin Matuska 
write
s:
> Author: mm
> Date: Tue Nov 29 22:14:42 2016
> New Revision: 309300
> URL: https://svnweb.freebsd.org/changeset/base/309300
> 
> Log:
>   MFV r309299:
>   Sync libarchive with vendor.
>   
>   Important vendor bugfixes (relevant to FreeBSD):
>   #821: tar -P cannot extract hardlinks through symlinks
>   #825: Add sanity check of tar "uid, "gid" and "mtime" fields
>   
>   PR: 213255
>   Reported by:Tijl Coosemans 
>   MFC after:  1 week
> 
> Added:
>   head/contrib/libarchive/libarchive/test/test_compat_gtar_2.tar.uu
>  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/test/
> test_compat_gtar_2.tar.uu
>   head/contrib/libarchive/libarchive/test/test_compat_star_acl_posix1e.c
>  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/test/
> test_compat_star_acl_posix1e.c
>   head/contrib/libarchive/libarchive/test/test_compat_star_acl_posix1e.tar.uu
>  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/test/
> test_compat_star_acl_posix1e.tar.uu
>   head/contrib/libarchive/libarchive/test/test_read_format_raw.bufr.uu
>  - copied unchanged from r309299, vendor/libarchive/dist/libarchive/test/
> test_read_format_raw.bufr.uu
> Modified:
>   head/contrib/libarchive/NEWS
>   head/contrib/libarchive/libarchive/archive_acl.c
>   head/contrib/libarchive/libarchive/archive_entry.c
>   head/contrib/libarchive/libarchive/archive_entry.h
>   head/contrib/libarchive/libarchive/archive_entry_acl.3
>   head/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
>   head/contrib/libarchive/libarchive/archive_read_support_filter_xz.c
>   head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
>   head/contrib/libarchive/libarchive/archive_read_support_format_xar.c
>   head/contrib/libarchive/libarchive/archive_write_disk_posix.c
>   head/contrib/libarchive/libarchive/test/test_compat_gtar.c
>   head/contrib/libarchive/libarchive/test/test_read_format_raw.c
>   head/contrib/libarchive/libarchive/test/test_sparse_basic.c
>   head/contrib/libarchive/tar/test/test_symlink_dir.c
>   head/lib/libarchive/tests/Makefile
> Directory Properties:
>   head/contrib/libarchive/   (props changed)
> 
[...]
> Modified: head/contrib/libarchive/libarchive/archive_read_support_format_tar.
> c
> =
> =
> --- head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
>   Tue Nov 29 21:53:16 2016(r309299)
> +++ head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
>   Tue Nov 29 22:14:42 2016(r309300)
> @@ -294,6 +294,46 @@ archive_read_format_tar_cleanup(struct a
>   return (ARCHIVE_OK);
>  }
>  
> +static int
> +validate_number_field(const char* p_field, size_t i_size)
> +{
> + unsigned char marker = (unsigned char)p_field[0];
> + /* octal? */
> + if ((marker >= '0' && marker <= '7') || marker == ' ') {
> + size_t i = 0;
> + int octal_found = 0;
> + for (i = 0; i < i_size; ++i) {
> + switch (p_field[i])
> + {
> + case ' ': /* skip any leading spaces and trailing space
> */
> + if (octal_found == 0 || i == i_size - 1) {
> + continue;
> + }
> + break;
> + case '\0': /* null is allowed only at the end */
> + if (i != i_size - 1) {
> + return 0;
> + }
> + break;
> + /* rest must be octal digits */
> + case '0': case '1': case '2': case '3':
> + case '4': case '5': case '6': case '7':
> + ++octal_found;
> + break;
> + }
> + }
> + return octal_found > 0;
> + }
> + /* base 256 (i.e. binary number) */
> + else if (marker == 128 || marker == 255 || marker == 0) {
> + /* nothing to check */
> + return 1;
> + }
> + /* not a number field */
> + else {
> + return 0;
> + }
> +}
>  
>  static int
>  archive_read_format_tar_bid(struct archive_read *a, int best_bid)
> @@ -346,23 +386,23 @@ archive_read_format_tar_bid(struct archi
>   return (0);
>   bid += 2;  /* 6 bits of variation in an 8-bit field leaves 2 bits. */
>  
> - /* Sanity check: Look at first byte of mode field. */
> - switch (255 & (unsigned)header->mode[0]) {
> - case 0: case 255:
> - /* Base-256 value: No further verification possible! */
> - break;
> - case ' ': /* Not recommended, but not illegal, either. */
> - break;
> - case '0':