shithub: scc

Download patch

ref: 85b514f5c1368e93ba0f368366fd68db0a4eb3d6
parent: e417ad93949172889df996396f7e46560cc81d9d
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Mar 5 16:52:30 EST 2018

[nm] Extrace correct name of archive members

--- a/inc/ar.h
+++ b/inc/ar.h
@@ -2,9 +2,11 @@
 #define ARMAG      "!<arch>\n"     /* ar "magic number" */
 #define SARMAG     8               /* strlen(ARMAG); */
 #define ARFMAG     "`\n"
+#define SARNAM     16
 
+
 struct ar_hdr {
-        char ar_name[16];               /* name */
+        char ar_name[SARNAM];           /* name */
         char ar_date[12];               /* modification time */
         char ar_uid[6];                 /* user id */
         char ar_gid[6];                 /* group id */
--- a/nm/main.c
+++ b/nm/main.c
@@ -39,11 +39,26 @@
 	return strncmp(magic, ARMAG, SARMAG) == 0;
 }
 
-static void
+static char *
+getfname(struct ar_hdr *hdr, char *dst)
+{
+	char *p;
+
+	memcpy(dst, hdr->ar_name, SARNAM);
+	dst[SARNAM] = '\0';
+	if ((p = strchr(dst, ' ')) != NULL)
+		*p = '\0';
+	if ((p =  strchr(dst, '/')) != NULL)
+		*p = '\0';
+	return (*p == '\0') ? NULL : dst;
+}
+
+static void
 ar(char *fname, FILE *fp)
 {
 	struct ar_hdr hdr;
 	long pos, siz;
+	char member[SARNAM+1];
 
 	arflag = 1;
 	fseek(fp, sizeof(struct ar_hdr), SEEK_CUR);
@@ -51,6 +66,9 @@
 	while (fread(&hdr, sizeof(hdr), 1, fp) == 1) {
 		pos = ftell(fp);
 		if (strncmp(hdr.ar_fmag, ARFMAG, strlen(ARFMAG)))
+			goto corrupted;
+
+		if (!getfname(&hdr, member))
 			goto corrupted;
 
 		siz = 0;