Use vis(3) to encode/decode the target for symlinks.

Make vis(3) decode errors fatal for both symlink targets and fienames.
This commit is contained in:
Poul-Henning Kamp 2003-10-30 12:03:25 +00:00
parent 13b31fb0d8
commit 5d9f6ca65c
2 changed files with 13 additions and 10 deletions

View File

@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/stat.h>
#include <vis.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
@ -350,11 +351,13 @@ ftype(u_int type)
char *
rlink(char *name)
{
static char lbuf[MAXPATHLEN];
char tbuf[MAXPATHLEN];
static char lbuf[MAXPATHLEN * 4];
int len;
if ((len = readlink(name, lbuf, sizeof(lbuf) - 1)) == -1)
if ((len = readlink(name, tbuf, sizeof(tbuf) - 1)) == -1)
err(1, "line %d: %s", lineno, name);
lbuf[len] = '\0';
tbuf[len] = '\0';
strvis(lbuf, tbuf, VIS_WHITE | VIS_OCTAL);
return (lbuf);
}

View File

@ -143,11 +143,8 @@ noparent: errx(1, "line %d: no parent node", lineno);
#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);
}
if (strunvis(centry->name, p) == -1)
errx(1, "filename %s is ill-encoded", p);
set(NULL, centry);
if (!root) {
@ -244,8 +241,11 @@ set(char *t, NODE *ip)
lineno, val);
break;
case F_SLINK:
if ((ip->slink = strdup(val)) == NULL)
errx(1, "strdup");
ip->slink = malloc(strlen(val));
if (ip->slink == NULL)
errx(1, "malloc");
if (strunvis(ip->slink, val) == -1)
errx(1, "symlink %s is ill-encoded", val);
break;
case F_TIME:
ip->st_mtimespec.tv_sec = strtoul(val, &ep, 10);