From 8fdba437af4fb14960e87724b2164ff28dc5da55 Mon Sep 17 00:00:00 2001 From: Pali Rohár Date: Sat, 23 Jun 2012 14:09:33 +0200 Subject: Unpacking fiasco - added support for FW headers (FW name) --- src/fiasco.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'src/fiasco.c') diff --git a/src/fiasco.c b/src/fiasco.c index cb577f2..dd2c938 100644 --- a/src/fiasco.c +++ b/src/fiasco.c @@ -36,7 +36,8 @@ int openfiasco(const char *name, const char *piece_grep, int v) unsigned char buf[256]; unsigned char data[256]; unsigned char *pdata, *pdataend; - unsigned int namelen; + unsigned int headerlen; + unsigned int blockcount; off_t off, here; int i; @@ -57,21 +58,40 @@ int openfiasco(const char *name, const char *piece_grep, int v) printf("Invalid header\n"); return close(header.fd); } - memcpy(&namelen,buf+1,4); - namelen = ntohl(namelen); - if (namelen>128) { + + memcpy(&headerlen,buf+1,4); + headerlen = ntohl(headerlen); + if (headerlen>128) { printf("Stupid length at header. Is this a joke?\n"); return close(header.fd); } + memset(buf,'\0', 128); - if (read(header.fd, buf, namelen) != namelen) { - printf("Invalid read of %d bytes\n", namelen); + if (read(header.fd, buf, headerlen) != headerlen) { + printf("Invalid read of %d bytes\n", headerlen); + return close(header.fd); + } + + memcpy(&blockcount,buf,4); + blockcount = ntohl(blockcount); + if (blockcount==0) { + printf("Error: No block in header\n"); return close(header.fd); } - if (v) printf("Fiasco version: %2d\n", buf[3]); - strcpy(header.fwname, (char *)buf+6); - if (v) for(i=6;i