shithub: scc

Download patch

ref: 914c674f1eec2150b7d2c2bb8066c023c66878dd
parent: abef896b724bbd7f0f2ef2c80df4f479dfac297d
author: Quentin Rameau <quinq@fifth.space>
date: Fri Jan 11 08:57:56 EST 2019

[ar] Check filenames before processing archive

--- a/src/cmd/ar.c
+++ b/src/cmd/ar.c
@@ -119,8 +119,6 @@
 
 	if (vflag)
 		printf("%c - %s\n", letter, fname);
-	if (strlen(fname) > 16)
-		fprintf(stderr, "ar: %s: name too long, truncated\n", fname);
 	if ((from = fopen(pname, "rb")) == NULL)
 		error("opening member '%s': %s", pname, errstr());
 	if (getstat(pname, &prop) < 0)
@@ -548,6 +546,22 @@
 }
 
 static void
+checkfnames(int argc, char *argv[])
+{
+	size_t l;
+	char *p;
+
+	for ( ; argc-- > 0; ++argv) {
+		p = canonical(*argv);
+		l = strcspn(p, invalidchars);
+		if (l > 16)
+			error("file: '%s': name too long", *argv);
+		if (p[l] != '\0')
+			error("file: '%s': name invalid", *argv);
+	}
+}
+
+static void
 usage(void)
 {
 	fputs("ar [-drqtpmx][posname] [-vuaibcl] [posname] arfile name ...\n",
@@ -628,7 +642,8 @@
 	signal(SIGTERM, sigfun);
 
 	arfile = *argv;
-	ar(key, ++argv, --argc);
+	checkfnames(--argc, ++argv);
+	ar(key, argv, argc);
 
 	fflush(stdout);
 	if (ferror(stdout))
--- a/src/cmd/posix.c
+++ b/src/cmd/posix.c
@@ -9,6 +9,8 @@
 
 #include "sys.h"
 
+const char invalidchars[] = " ";
+
 time_t
 totime(long long t)
 {
--- a/src/cmd/sys.h
+++ b/src/cmd/sys.h
@@ -6,6 +6,8 @@
 	time_t time;
 };
 
+extern const char invalidchars[];
+
 extern time_t totime(long long t);
 extern char *canonical(char *path);
 extern int getstat(char *fname, struct fprop *prop);