From 610481bce57b156b5092ec4daa74fbab46abe6fd Mon Sep 17 00:00:00 2001 From: Joseph Koshy Date: Tue, 12 Jan 1999 02:58:23 +0000 Subject: [PATCH] Teach mtree(8) to handle whitespace in filenames. Uses strvis(3). PR: bin/3246 Submitted by: Eugene M. Kim Reviewed by: jkoshy, wollman --- usr.sbin/mtree/create.c | 15 ++++++++++++--- usr.sbin/mtree/spec.c | 9 +++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/usr.sbin/mtree/create.c b/usr.sbin/mtree/create.c index af9f50467db9..e5fbe2056117 100644 --- a/usr.sbin/mtree/create.c +++ b/usr.sbin/mtree/create.c @@ -36,7 +36,7 @@ static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93"; #endif static const char rcsid[] = - "$Id: create.c,v 1.10 1998/06/05 14:43:39 peter Exp $"; + "$Id: create.c,v 1.11 1998/08/02 14:41:34 bde Exp $"; #endif /* not lint */ #include @@ -52,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #include "mtree.h" #include "extern.h" @@ -138,11 +139,19 @@ statf(indent, p) struct passwd *pw; u_long len, val; int fd, offset; + char *escaped_name; + + escaped_name = calloc(1, p->fts_namelen * 4 + 1); + if (escaped_name == NULL) + errx(1, "statf(): calloc() failed"); + strvis(escaped_name, p->fts_name, VIS_WHITE); if (iflag || S_ISDIR(p->fts_statp->st_mode)) - offset = printf("%*s%s", indent, "", p->fts_name); + offset = printf("%*s%s", indent, "", escaped_name); else - offset = printf("%*s %s", indent, "", p->fts_name); + offset = printf("%*s %s", indent, "", escaped_name); + + free(escaped_name); if (offset > (INDENTNAMELEN + indent)) offset = MAXLINELEN; diff --git a/usr.sbin/mtree/spec.c b/usr.sbin/mtree/spec.c index 7d7906bbd085..1e9c5fd47e89 100644 --- a/usr.sbin/mtree/spec.c +++ b/usr.sbin/mtree/spec.c @@ -36,7 +36,7 @@ static char sccsid[] = "@(#)spec.c 8.1 (Berkeley) 6/6/93"; #endif static const char rcsid[] = - "$Id: spec.c,v 1.7 1997/10/01 06:30:02 charnier Exp $"; + "$Id: spec.c,v 1.8 1998/12/16 04:54:08 imp Exp $"; #endif /* not lint */ #include @@ -49,6 +49,7 @@ static const char rcsid[] = #include #include #include +#include #include "mtree.h" #include "extern.h" @@ -143,10 +144,14 @@ noparent: errx(1, "line %d: no parent node", lineno); if ((centry = calloc(1, sizeof(NODE) + strlen(p))) == NULL) errx(1, "calloc"); *centry = ginfo; - (void)strcpy(centry->name, p); #define MAGIC "?*[" if (strpbrk(p, MAGIC)) centry->flags |= F_MAGIC; + if (strunvis(centry->name, p) == -1) { + warnx("filename %s is ill-encoded and literally used", + p); + strcpy(centry->name, p); + } set(NULL, centry); if (!root) {