[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#645346: pax: FTBFS on hurd-i386



On Sat, 2011-10-15 at 01:20 +0200, Guillem Jover wrote:
> 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
...
> After considering this, I think it would be a better option and way more
> portable to use realpath(path, NULL) when _POSIX_VERSION >= 200809L.

Attached is an updated patch, taking Guillems comments into
consideration. We are looking forward to se it applied in the next
Debian release of pax (and in upstream in due time).

Thanks!

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-15 12:56:46.000000000 +0000
@@ -351,7 +351,7 @@
 	int pass = 0;
 	mode_t file_mode;
 	struct stat sb;
-	char target[MAXPATHLEN];
+	char *target = NULL;
 	char *nm = arcn->name;
 	int len;
 
@@ -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);
+					    sb.st_size);
 					if (len == -1) {
 						syswarn(0, errno,
 						   "cannot follow symlink %s in chain for %s",
@@ -411,6 +418,7 @@
 			paxwarn(0,
 			    "%s skipped. Sockets cannot be copied or extracted",
 			    nm);
+			free(target);
 			return(-1);
 		case PAX_SLK:
 			res = symlink(arcn->ln_name, nm);
@@ -425,6 +433,7 @@
 			 */
 			paxwarn(0, "%s has an unknown file type, skipping",
 				nm);
+			free(target);
 			return(-1);
 		}
 
@@ -440,14 +449,17 @@
 		 * we failed to make the node
 		 */
 		oerrno = errno;
-		if ((ign = unlnk_exist(nm, arcn->type)) < 0)
+		if ((ign = unlnk_exist(nm, arcn->type)) < 0) {
+			free(target);
 			return(-1);
+		}
 
 		if (++pass <= 1)
 			continue;
 
 		if (nodirs || chk_path(nm,arcn->sb.st_uid,arcn->sb.st_gid) < 0) {
 			syswarn(1, oerrno, "Could not create: %s", nm);
+			free(target);
 			return(-1);
 		}
 	}
@@ -465,8 +477,10 @@
 	/*
 	 * symlinks are done now.
 	 */
-	if (arcn->type == PAX_SLK)
+	if (arcn->type == PAX_SLK) {
+		free(target);
 		return(0);
+	}
 
 	/*
 	 * IMPORTANT SECURITY NOTE:
@@ -517,6 +531,7 @@
 
 	if (patime || pmtime)
 		set_ftime(nm, arcn->sb.st_mtime, arcn->sb.st_atime, 0);
+	free(target);
 	return(0);
 }
 
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-15 13:39:29.000000000 +0000
@@ -55,6 +55,7 @@
 #include "pax.h"
 #include "tables.h"
 #include "extern.h"
+#include "features.h"
 
 /*
  * Routines for controlling the contents of all the different databases pax
@@ -1126,13 +1127,21 @@
 add_dir(char *name, struct stat *psb, int frc_mode)
 {
 	DIRDATA *dblk;
+#if (_POSIX_C_SOURCE - 0) >= 200809L
+	char *rp = NULL;
+#else
 	char realname[MAXPATHLEN], *rp;
+#endif
 
 	if (dirp == NULL)
 		return;
 
 	if (havechd && *name != '/') {
+#if (_POSIX_C_SOURCE - 0) >= 200809L
+		if ((rp = realpath(name, NULL)) == NULL) {
+#else
 		if ((rp = realpath(name, realname)) == NULL) {
+#endif
 			paxwarn(1, "Cannot canonicalize %s", name);
 			return;
 		}
@@ -1143,6 +1152,9 @@
 		if (dblk == NULL) {
 			paxwarn(1, "Unable to store mode and times for created"
 			    " directory: %s", name);
+#if (_POSIX_C_SOURCE - 0) >= 200809L
+			free(rp);
+#endif
 			return;
 		}
 		dirp = dblk;
@@ -1152,6 +1164,9 @@
 	if ((dblk->name = strdup(name)) == NULL) {
 		paxwarn(1, "Unable to store mode and times for created"
 		    " directory: %s", name);
+#if (_POSIX_C_SOURCE - 0) >= 200809L
+		free(rp);
+#endif
 		return;
 	}
 	dblk->mode = psb->st_mode & 0xffff;
@@ -1159,6 +1174,9 @@
 	dblk->atime = psb->st_atime;
 	dblk->frc_mode = frc_mode;
 	++dircnt;
+#if (_POSIX_C_SOURCE - 0) >= 200809L
+	free(rp);
+#endif
 }
 
 /*

Reply to: