about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2020-08-05 13:31:15 +0200
committerLeah Neukirchen <leah@vuxu.org>2020-08-05 13:31:15 +0200
commitfec4e06671b9d896faeed90925ebf3b03679b90e (patch)
tree769fba21692d1308255afe3e0c1744ca5721c7ec
parent7e9e75bd8848102d073f6b2beb45bced6349afe9 (diff)
downloadmblaze-fec4e06671b9d896faeed90925ebf3b03679b90e.tar.gz
mblaze-fec4e06671b9d896faeed90925ebf3b03679b90e.tar.xz
mblaze-fec4e06671b9d896faeed90925ebf3b03679b90e.zip
mmime: be more strict when detecting content types for the include syntax
Previously, shebangs would be (mis)detected: #!/bin/sh -e
-rw-r--r--mmime.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/mmime.c b/mmime.c
index 79e1ef0..da7f179 100644
--- a/mmime.c
+++ b/mmime.c
@@ -1,6 +1,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include <ctype.h>
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -356,6 +357,22 @@ force_qp:
 	printf("\n");
 }
 
+static int
+valid_content_type(char *s)
+{
+	int slash = 0;
+
+	for (; *s; s++)
+		if (*s == '/')
+			slash++;
+		else if (isalnum(*s) || *s == '-' || *s == '+' || *s == '.')
+			; /* ok */
+		else
+			return 0;
+
+	return slash == 1;
+}
+
 int
 gen_build()
 {
@@ -400,7 +417,7 @@ gen_build()
 			if (f) {
 				char of = *f;
 				*f = 0;
-				if (strchr(line, '/')) {
+				if (valid_content_type(line+1)) {
 					printf("\n--%s\n", sep);
 					if (line[read-1] == '\n')
 						line[read-1] = 0;