---
tar.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/tar.c b/tar.c
index b1f3b27..0bd3fcf 100644
--- a/tar.c
+++ b/tar.c
_AT_@ -359,6 +359,27 @@ sanitize(struct header *h)
}
static void
+sanitizepath(char *p)
+{
+ size_t l;
+ char *s;
+
+ /* Strip leading '/' characters */
+ while(*p == '/') {
+ l = strlen(p);
+ memmove(p, p+1, l - 1);
+ *(p + l - 1) = '\0';
+ }
+
+ /* Strip '../' from anywhere */
+ while((s = strstr(p, "../")) != NULL) {
+ l = strlen(s);
+ memmove(s, s + 3, l - 3);
+ *(s + l - 3) = '\0';
+ }
+}
+
+static void
chktar(struct header *h)
{
char tmp[8], *err;
_AT_@ -407,6 +428,7 @@ xt(int argc, char *argv[], int (*fn)(char *, ssize_t, char[BLKSIZ]))
(int)sizeof(h->prefix), h->prefix);
snprintf(fname + n, sizeof(fname) - n, "%.*s",
(int)sizeof(h->name), h->name);
+ sanitizepath(fname);
if ((size = strtol(h->size, &p, 8)) < 0 || *p != '\0')
eprintf("strtol %s: invalid number\n", h->size);
--
1.7.10.4
--ReaqsoxgOBHFXBhH--
Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Mon Apr 27 2015 - 14:48:08 CEST