Hi!

On Fri, 2011-10-14 at 18:33:13 +0200, Svante Signell wrote:
> Package: pax
> Version: 20090728-2
> Severity: important
> Tags: patch
> Usertags: hurd
> 
> Attached is a small patch to make pax-20090728 build under GNU/Hurd.
> The first part is using the already issued lstat(2) call to find out
> the size for a dynamic allocation of a character string, avoiding the
> MAXPATHLEN issue. Secondly the reaplath(3) call is conditionally
> replaced with canonicalize_file_name(3).

> diff -ur pax-20090728/file_subs.c pax-20090728.modified/file_subs.c
> --- pax-20090728/file_subs.c  2009-07-28 17:38:28.000000000 +0000
> +++ pax-20090728.modified/file_subs.c 2011-10-13 14:45:13.000000000 +0000
> @@ -374,8 +374,15 @@
>                       if (strcmp(NM_TAR, argv0) == 0 && Lflag) {
>                               while (lstat(nm, &sb) == 0 &&
>                                   S_ISLNK(sb.st_mode)) {
> +                                     target = malloc(sb.st_size + 1);
> +                                     if (target == NULL) {
> +                                             oerrno = ENOMEM;
> +                                             syswarn(1, oerrno,
> +                                                 "Insufficient memory");
> +                                             return(-1);
> +                                     }
>                                       len = readlink(nm, target,
> -                                         sizeof target - 1);
> +                                         strlen(target));

This is not right, target can contain garbage so strlen(target) could
return anything, or segfault. The correct value is the same used in
the malloc call.

>                                       if (len == -1) {
>                                               syswarn(0, errno,
>                                                  "cannot follow symlink %s in 
> chain for %s",
[...]

You forgot a free on the return(0) case.

> diff -ur pax-20090728/tables.c pax-20090728.modified/tables.c
> --- pax-20090728/tables.c     2009-07-28 17:38:28.000000000 +0000
> +++ pax-20090728.modified/tables.c    2011-10-13 14:20:10.000000000 +0000
> @@ -1126,13 +1126,21 @@
>  add_dir(char *name, struct stat *psb, int frc_mode)
>  {
>       DIRDATA *dblk;
> +#ifdef __GNU__
> +     char *rp = NULL;
> +#else
>       char realname[MAXPATHLEN], *rp;
> +#endif

After considering this, I think it would be a better option and way more
portable to use realpath(path, NULL) when _POSIX_VERSION >= 200809L.

regards,
guillem



-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to