Fix unpacking fiasco images (check for number of subsections). Now unpacking is complete!

This commit is contained in:
Pali Rohár committed 2012-06-23 15:54:13 +02:00
1 parent 5da30a5bc5
commit 535561efbf
1 file changed
+21 -14
+21 -14
View File
@@ -39,6 +39,7 @@ int openfiasco(const char *name, const char *piece_grep, int v)
unsigned int headerlen; unsigned int headerlen;
unsigned int blockcount; unsigned int blockcount;
off_t off, here; off_t off, here;
int subsections;
int i; int i;
memset(&header, 0, sizeof(header)); memset(&header, 0, sizeof(header));
@@ -113,6 +114,8 @@ int openfiasco(const char *name, const char *piece_grep, int v)
} }
if (i && v) printf("Skipping %d padding bytes\n", i); if (i && v) printf("Skipping %d padding bytes\n", i);
subsections = buf[1]-1;
if (read(header.fd, buf+7, 2)<2) if (read(header.fd, buf+7, 2)<2)
break; break;
header.hash = buf[7]<<8|buf[8]; header.hash = buf[7]<<8|buf[8];
@@ -143,11 +146,9 @@ int openfiasco(const char *name, const char *piece_grep, int v)
printf(" offset: 0x%08x\n", (unsigned int)here); printf(" offset: 0x%08x\n", (unsigned int)here);
printf(" size: %d bytes\n", header.size); printf(" size: %d bytes\n", header.size);
printf(" hash: %04x\n", header.hash); printf(" hash: %04x\n", header.hash);
printf(" subsections: %d\n", subsections);
} }
//printf("BYTE: %02x %02x %02x %02x %02x\n",
// buf[4], buf[5], buf[6], buf[7], buf[8]);
/* XXX this is not ok */
//printf("BUF8: %02x\n", buf[8]);
memset(header.device, 0, sizeof(header.device)); memset(header.device, 0, sizeof(header.device));
memset(header.hwrevs, 0, sizeof(header.hwrevs)); memset(header.hwrevs, 0, sizeof(header.hwrevs));
memset(header.version, 0, sizeof(header.version)); memset(header.version, 0, sizeof(header.version));
@@ -155,20 +156,21 @@ int openfiasco(const char *name, const char *piece_grep, int v)
free(header.layout); free(header.layout);
header.layout = NULL; header.layout = NULL;
} }
while ((buf[8] >= '1' && buf[8] <= '4') || buf[8] == '/') {
while (subsections > 0) {
if (read(header.fd, data, 1)<1) if (read(header.fd, data, 1)<1)
return close(header.fd); return close(header.fd);
i = data[0]; i = data[0];
if (read(header.fd, data, i)<i) if (read(header.fd, data, i)<i)
return close(header.fd); return close(header.fd);
if (data[0]) { {
if (v) { if (v) {
printf(" subinfo\n"); printf(" subinfo\n");
printf(" type: "); printf(" type: ");
if (buf[8] == '1') printf("version string"); if (buf[8] == '1') printf("version string");
else if (buf[8] == '2') printf("hw revision"); else if (buf[8] == '2') printf("hw revision");
else if (buf[8] == '3') printf("layout"); else if (buf[8] == '3') printf("layout");
else printf("unknown (%c)", buf[8]); else printf("unknown (%c:0x%x)", buf[8], buf[8]);
printf("\n"); printf("\n");
printf(" length: %d\n", i); printf(" length: %d\n", i);
} }
@@ -189,10 +191,17 @@ int openfiasco(const char *name, const char *piece_grep, int v)
else printf("data"); else printf("data");
if (buf[8] == '2' && pdata != data) if (buf[8] == '2' && pdata != data)
printf(": %s\n", buf2); printf(": %s\n", buf2);
else if (buf[8] != '3' && buf[8] != '/') else if (buf[8] == '3')
printf(": %s\n", pdata);
else
printf(": (not printing)\n"); printf(": (not printing)\n");
else if (buf[8] == '1' || buf[8] == '2')
printf(": %s\n", pdata);
else {
char *buf3 = malloc(i+1);
memcpy(buf3, pdata, i);
buf3[i] = 0;
printf(": (raw) %s\n", buf3);
free(buf3);
}
} }
if (buf[8] == '1') { if (buf[8] == '1') {
strncpy(header.version, (char *)pdata, sizeof(header.version)-1); strncpy(header.version, (char *)pdata, sizeof(header.version)-1);
@@ -216,14 +225,12 @@ int openfiasco(const char *name, const char *piece_grep, int v)
pdata += strlen((char*)pdata)+1; pdata += strlen((char*)pdata)+1;
for(;*pdata=='\0' && pdata<pdataend; pdata++); for(;*pdata=='\0' && pdata<pdataend; pdata++);
} }
} else {
/* End of comments, ignore one char and next is image data */
lseek(header.fd, 1, SEEK_CUR);
break;
} }
if (read(header.fd, buf+8, 1)<1) if (read(header.fd, buf+8, 1)<1)
return close(header.fd); return close(header.fd);
--subsections;
} }
header.name = malloc(strlen(header.type)+strlen(header.device)+strlen(header.hwrevs)+strlen(header.version)+4); header.name = malloc(strlen(header.type)+strlen(header.device)+strlen(header.hwrevs)+strlen(header.version)+4);
if (!header.name) { if (!header.name) {
printf("malloc error\n"); printf("malloc error\n");