Blob Blame History Raw
diff --git a/magic/Magdir/filesystems b/magic/Magdir/filesystems
index a2c2966..ecfa6c2 100644
--- a/magic/Magdir/filesystems
+++ b/magic/Magdir/filesystems
@@ -1251,7 +1251,7 @@
 >>38917	byte     >0x33      (unknown version, ID 0x%X)
 >>38917	byte     <0x31      (unknown version, ID 0x%X)
 # "application id" which appears to be used as a volume label
->32808	string    >\0       '%s'
+>32808	string/T  >\0       '%s'
 >34816	string    \000CD001\001EL\ TORITO\ SPECIFICATION    (bootable)
 37633	string    CD001     ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
 !:mime	application/x-iso9660-image
diff --git a/src/apprentice.c b/src/apprentice.c
index 0490642..6dd8381 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -1452,6 +1452,9 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
 						goto bad;
 					m->str_flags |= PSTRING_LENGTH_INCLUDES_ITSELF;
 					break;
+				case CHAR_TRIM:
+					m->str_flags |= STRING_TRIM;
+					break;
 				default:
 				bad:
 					if (ms->flags & MAGIC_CHECK)
diff --git a/src/file.h b/src/file.h
index e02009f..1b5f53f 100644
--- a/src/file.h
+++ b/src/file.h
@@ -307,6 +307,7 @@ struct magic {
 #define PSTRING_LEN	\
     (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE)
 #define PSTRING_LENGTH_INCLUDES_ITSELF		BIT(12)
+#define STRING_TRIM             BIT(13)
 #define CHAR_COMPACT_WHITESPACE			'W'
 #define CHAR_COMPACT_OPTIONAL_WHITESPACE	'w'
 #define CHAR_IGNORE_LOWERCASE			'c'
@@ -321,6 +322,7 @@ struct magic {
 #define CHAR_PSTRING_4_BE			'L'
 #define CHAR_PSTRING_4_LE			'l'
 #define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF     'J'
+#define CHAR_TRIM               'T'
 #define STRING_IGNORE_CASE		(STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
 #define STRING_DEFAULT_RANGE		100
 
diff --git a/src/softmagic.c b/src/softmagic.c
index 8d08cad..f084edd 100644
--- a/src/softmagic.c
+++ b/src/softmagic.c
@@ -451,11 +451,30 @@ mprint(struct magic_set *ms, struct magic *m)
 			t = ms->offset + m->vallen;
 		}
 		else {
+			char *str = p->s;
+
+			/* compute t before we mangle the string? */
+			t = ms->offset + strlen(str);
+
 			if (*m->value.s == '\0')
-				p->s[strcspn(p->s, "\n")] = '\0';
-			if (file_printf(ms, m->desc, p->s) == -1)
+				str[strcspn(str, "\n")] = '\0';
+
+			if (m->str_flags & STRING_TRIM) {
+				char *last;
+				while (isspace((unsigned char)*str))
+					str++;
+				last = str;
+				while (*last)
+					last++;
+				--last;
+				while (isspace((unsigned char)*last))
+					last--;
+				*++last = '\0';
+			}
+
+			if (file_printf(ms, m->desc, str) == -1)
 				return -1;
-			t = ms->offset + strlen(p->s);
+
 			if (m->type == FILE_PSTRING)
 				t += file_pstring_length_size(m);
 		}