Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Mar 2002 14:50:01 -0800 (PST)
From:      Nicolas Rachinsky <list@rachinsky.de>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/35454: mtree can't handle symlinks referencing files which names contain spaces
Message-ID:  <200203082250.g28Mo1d06043@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/35454; it has been noted by GNATS.

From: Nicolas Rachinsky <list@rachinsky.de>
To: freebsd-gnats-submit@FreeBSD.org
Cc:  
Subject: Re: bin/35454: mtree can't handle symlinks referencing files which names contain spaces
Date: Fri, 8 Mar 2002 23:47:04 +0100

 I've just created this patch which seems to solve the problem:
 
 
 Index: create.c
 ===================================================================
 RCS file: /usr/cvs-freebsd/src/usr.sbin/mtree/create.c,v
 retrieving revision 1.18.2.3
 diff -u -r1.18.2.3 create.c
 --- create.c	12 Jan 2001 19:17:18 -0000	1.18.2.3
 +++ create.c	8 Mar 2002 22:38:18 -0000
 @@ -154,7 +154,7 @@
  	u_long len, val;
  	int fd, offset;
  	char *fflags;
 -	char *escaped_name;
 +	char *escaped_name,*s;
  
  	escaped_name = calloc(1, p->fts_namelen * 4  +  1);
  	if (escaped_name == NULL)
 @@ -256,7 +256,18 @@
  #endif /* RMD160 */
  	if (keys & F_SLINK &&
  	    (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE))
 -		output(indent, &offset, "link=%s", rlink(p->fts_accpath));
 +	{
 +		s=strdup(rlink(p->fts_accpath));
 +		if(!s)
 +			errx(1, "statf(): strdup() failed");
 +		escaped_name = calloc(1, strlen(s) * 4  +  1);
 +		if (escaped_name == NULL)
 +			errx(1, "statf(): calloc() failed");
 +		strvis(escaped_name, s, VIS_WHITE | VIS_OCTAL);
 +		output(indent, &offset, "link=%s", escaped_name);
 +		free(escaped_name);
 +		free(s);
 +	}
  	if (keys & F_FLAGS && p->fts_statp->st_flags != flags) {
  		fflags = flags_to_string(p->fts_statp->st_flags);
  		output(indent, &offset, "flags=%s", fflags);
 Index: spec.c
 ===================================================================
 RCS file: /usr/cvs-freebsd/src/usr.sbin/mtree/spec.c,v
 retrieving revision 1.13.2.1
 diff -u -r1.13.2.1 spec.c
 --- spec.c	28 Jun 2000 02:33:17 -0000	1.13.2.1
 +++ spec.c	8 Mar 2002 22:40:21 -0000
 @@ -181,6 +181,7 @@
  	mode_t *m;
  	int value;
  	char *ep;
 +	char *escaped_string;
  
  	for (; (kw = strtok(t, "= \t\n")); t = NULL) {
  		ip->flags |= type = parsekey(kw, &value);
 @@ -250,8 +251,16 @@
  				lineno, val);
  			break;
  		case F_SLINK:
 -			if ((ip->slink = strdup(val)) == NULL)
 +			if ((escaped_string = strdup(val)) == NULL)
  				errx(1, "strdup");
 +			if((ip->slink=calloc(1, strlen(escaped_string)  +  1)) == NULL)
 +				errx(1, "set(): calloc() failed");
 +			if (strunvis(ip->slink, escaped_string) == -1) {
 +				warnx("filename %s is ill-encoded and literally used",
 +				      escaped_string);
 +				strcpy(ip->slink, escaped_string); 
 +			}
 +			free(escaped_string);
  			break;
  		case F_TIME:
  			ip->st_mtimespec.tv_sec = strtoul(val, &ep, 10);

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203082250.g28Mo1d06043>