diff options
author | des <des@FreeBSD.org> | 2004-01-24 17:32:43 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 2004-01-24 17:32:43 +0000 |
commit | 4b35c88e147dfd64c29f561cd6052e86cbd3dd18 (patch) | |
tree | 2a1faf0c19b502bb94233d6e8b46dced6ca017ee /usr.sbin/pkg_install/add | |
parent | ba5185bd32d6a1bd08b7d530865a3d6ecaab45c6 (diff) | |
download | FreeBSD-src-4b35c88e147dfd64c29f561cd6052e86cbd3dd18.zip FreeBSD-src-4b35c88e147dfd64c29f561cd6052e86cbd3dd18.tar.gz |
Instead of bogusly complaining about odd file names, handle them properly
by escaping all suspicious characters.
MFC after: 3 days
Diffstat (limited to 'usr.sbin/pkg_install/add')
-rw-r--r-- | usr.sbin/pkg_install/add/extract.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/usr.sbin/pkg_install/add/extract.c b/usr.sbin/pkg_install/add/extract.c index 3b84abd..337fe4d 100644 --- a/usr.sbin/pkg_install/add/extract.c +++ b/usr.sbin/pkg_install/add/extract.c @@ -21,12 +21,13 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include <ctype.h> #include <err.h> #include "lib.h" #include "add.h" -#define STARTSTRING "tar cf - " +#define STARTSTRING "tar cf -" #define TOOBIG(str) \ (((int)strlen(str) + FILENAME_MAX + where_count > maxargs) ||\ ((int)strlen(str) + FILENAME_MAX + perm_count > maxargs)) @@ -76,6 +77,28 @@ rollback(const char *name, const char *home, PackingList start, PackingList stop } } +#define add_char(buf, len, pos, ch) do {\ + if ((pos) < (len)) { \ + buf[(pos)] = (ch); \ + buf[(pos) + 1] = '\0'; \ + } \ + ++(pos); \ +} while (0) + +int +add_arg(char *buf, int len, const char *str) +{ + int i = 0; + + add_char(buf, len, i, ' '); + for (; *str != '\0'; ++str) { + if (!isalnum(*str) && *str != '/' && *str != '.' && *str != '-') + add_char(buf, len, i, '\\'); + add_char(buf, len, i, *str); + } + return (i); +} + void extract_plist(const char *home, Package *pkg) { @@ -129,11 +152,6 @@ extract_plist(const char *home, Package *pkg) if (!Fake) { char try[FILENAME_MAX]; - if (strrchr(p->name,'\'')) { - cleanup(0); - errx(2, "%s: Bogus filename \"%s\"", __func__, p->name); - } - /* first try to rename it into place */ snprintf(try, FILENAME_MAX, "%s/%s", Directory, p->name); if (fexists(try)) { @@ -157,7 +175,7 @@ extract_plist(const char *home, Package *pkg) if (p->name[0] == '/' || TOOBIG(p->name)) { PUSHOUT(Directory); } - add_count = snprintf(&perm_args[perm_count], maxargs - perm_count, "'%s' ", p->name); + add_count = add_arg(&perm_args[perm_count], maxargs - perm_count, p->name); if (add_count < 0 || add_count >= maxargs - perm_count) { cleanup(0); errx(2, "%s: oops, miscounted strings!", __func__); @@ -177,15 +195,13 @@ extract_plist(const char *home, Package *pkg) else if (p->name[0] == '/' || TOOBIG(p->name)) { PUSHOUT(Directory); } - add_count = snprintf(&where_args[where_count], maxargs - where_count, " '%s'", p->name); + add_count = add_arg(&where_args[where_count], maxargs - where_count, p->name); if (add_count < 0 || add_count >= maxargs - where_count) { cleanup(0); errx(2, "%s: oops, miscounted strings!", __func__); } where_count += add_count; - add_count = snprintf(&perm_args[perm_count], - maxargs - perm_count, - "'%s' ", p->name); + add_count = add_arg(&perm_args[perm_count], maxargs - perm_count, p->name); if (add_count < 0 || add_count >= maxargs - perm_count) { cleanup(0); errx(2, "%s: oops, miscounted strings!", __func__); |