On Thu, Sep 07, 2017 at 09:53:50PM +0200, Otto Moerbeek wrote:
> So make len long and add a value check to make sure the unsigned long
> to long assignment is safe.
> 
> OK?

OK bluhm@

> Index: tar.c
> ===================================================================
> RCS file: /cvs/src/bin/pax/tar.c,v
> retrieving revision 1.63
> diff -u -p -r1.63 tar.c
> --- tar.c     26 Aug 2016 04:11:16 -0000      1.63
> +++ tar.c     7 Sep 2017 19:48:58 -0000
> @@ -1209,7 +1209,8 @@ static int
>  rd_xheader(ARCHD *arcn, int global, off_t size)
>  {
>       char buf[MAXXHDRSZ];
> -     unsigned long len;
> +     unsigned long ulen;
> +     long len;
>       char *delim, *keyword;
>       char *nextp, *p, *end;
>       int pad, ret = 0;
> @@ -1247,13 +1248,14 @@ rd_xheader(ARCHD *arcn, int global, off_
>                       break;
>               }
>               errno = 0;
> -             len = strtoul(p, &delim, 10);
> -             if (*delim != ' ' || (errno == ERANGE && len == ULONG_MAX) ||
> -                 len < MINXHDRSZ) {
> +             ulen = strtoul(p, &delim, 10);
> +             if (*delim != ' ' || (errno == ERANGE && ulen == ULONG_MAX) ||
> +                 ulen < MINXHDRSZ || ulen > LONG_MAX) {
>                       paxwarn(1, "Invalid extended header record length");
>                       ret = -1;
>                       break;
>               }
> +             len = ulen;
>               if (len > end - p) {
>                       paxwarn(1, "Extended header record length %lu is "
>                           "out of range", len);

Reply via email to