Changeset 1486


Ignore:
Timestamp:
2005-07-17T18:03:51+02:00 (13 years ago)
Author:
wbx
Message:

check if firmware is trx and is not too big, before unlocking/erasing/writing anything

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/package/openwrt/mtd.c

    r1431 r1486  
    5656 
    5757int 
     58trx_check(const char *trxfile, const char *mtd) 
     59{ 
     60        struct mtd_info_user mtdInfo; 
     61        int trxfd, fd; 
     62        size_t count; 
     63        struct trx_header trx; 
     64        struct stat trxstat; 
     65 
     66        trxfd = open(trxfile,O_RDONLY);  
     67        if(trxfd < 0) { 
     68                fprintf(stderr, "Could not open trx image: %s\n", trxfile); 
     69                exit(1); 
     70        } 
     71 
     72        if (fstat(trxfd,&trxstat) < 0) { 
     73                fprintf(stderr, "Could not get trx image file status: %s\n", trxfile); 
     74                close(trxfd); 
     75                exit(1); 
     76        } 
     77 
     78        count = read(trxfd, &trx, sizeof(struct trx_header)); 
     79        if (count < sizeof(struct trx_header)) { 
     80                fprintf(stderr, "Could not trx header, file too small (%ld bytes)\n", count); 
     81                close(trxfd); 
     82                exit(1); 
     83        } 
     84 
     85        if (trx.magic != TRX_MAGIC || trx.len < sizeof(struct trx_header)) { 
     86                fprintf(stderr, "Bad trx header\n"); 
     87                fprintf(stderr, "If this is a firmware in bin format, like some of the\n" 
     88                                "original firmware files are, use following command to convert to trx:\n" 
     89                                "dd if=firmware.bin of=firmware.trx bs=32 skip=1\n"); 
     90                close(trxfd); 
     91                exit(1); 
     92        } 
     93         
     94        lseek(trxfd, 0, SEEK_SET); 
     95 
     96        /* check if image fits to mtd device */ 
     97 
     98        fd = mtd_open(mtd, O_RDWR); 
     99        if(fd < 0) { 
     100                fprintf(stderr, "Could not open mtd device: %s\n", mtd); 
     101                exit(1); 
     102        } 
     103 
     104        if(ioctl(fd, MEMGETINFO, &mtdInfo)) { 
     105                fprintf(stderr, "Could not get MTD device info from %s\n", mtd); 
     106                close(fd); 
     107                exit(1); 
     108        } 
     109                 
     110        if(mtdInfo.size < trxstat.st_size) { 
     111                fprintf(stderr, "Image too big for partition: %s\n", mtd); 
     112                close(trxfd); 
     113                close(fd); 
     114                exit(1); 
     115        }        
     116         
     117        printf("Writing %s to %s ...\n", trxfile, mtd); 
     118 
     119        close(fd); 
     120 
     121        return(trxfd); 
     122} 
     123 
     124int 
    58125mtd_unlock(const char *mtd) 
    59126{ 
     
    147214 
    148215int 
    149 mtd_write(const char *trxfile, const char *mtd) 
    150 { 
    151         int fd,trxfd,i; 
    152         struct trx_header trx; 
    153         size_t count,result,size,written; 
     216mtd_write(int trxfd, const char *mtd) 
     217{ 
     218        int fd,i; 
     219        size_t result,size,written; 
    154220        struct mtd_info_user mtdInfo; 
    155221        struct erase_info_user mtdEraseInfo; 
     222        unsigned char src[BUFSIZE],dest[BUFSIZE]; 
    156223        struct stat trxstat; 
    157         unsigned char src[BUFSIZE],dest[BUFSIZE]; 
    158  
    159         trxfd = open(trxfile,O_RDONLY);  
    160         if(trxfd < 0) { 
    161                 fprintf(stderr, "Could not open trx image: %s\n", trxfile); 
    162                 exit(1); 
    163         } 
    164224 
    165225        if (fstat(trxfd,&trxstat) < 0) { 
    166                 fprintf(stderr, "Could not get trx image file status: %s\n", trxfile); 
    167                 close(trxfd); 
    168                 exit(1); 
    169         } 
    170  
    171         count = read(trxfd, &trx, sizeof(struct trx_header)); 
    172         if (count < sizeof(struct trx_header)) { 
    173                 fprintf(stderr, "Could not trx header, file too small (%ld bytes)\n", count); 
    174                 close(trxfd); 
    175                 exit(1); 
    176         } 
    177  
    178         if (trx.magic != TRX_MAGIC || trx.len < sizeof(struct trx_header)) { 
    179                 fprintf(stderr, "Bad trx header\n"); 
    180                 fprintf(stderr, "If this is a firmware in bin format, like some of the\n" 
    181                                 "original firmware files are, use following command to convert to trx:\n" 
    182                                 "dd if=firmware.bin of=firmware.trx bs=32 skip=1\n"); 
    183                 close(trxfd); 
    184                 exit(1); 
    185         } 
    186          
    187         lseek(trxfd, 0, SEEK_SET); 
    188          
     226                fprintf(stderr, "Could not get trx image file status\n"); 
     227                close(trxfd); 
     228                exit(1); 
     229        } 
     230 
    189231        fd = mtd_open(mtd, O_RDWR); 
    190232        if(fd < 0) { 
     
    199241        } 
    200242                 
    201         if(mtdInfo.size < trxstat.st_size) { 
    202                 fprintf(stderr, "Image too big for partition: %s\n", mtd); 
    203                 close(trxfd); 
    204                 exit(1); 
    205         }        
    206          
    207         printf("Writing %s to %s ...\n", trxfile, mtd); 
    208  
    209243        mtdEraseInfo.start = 0; 
    210244        mtdEraseInfo.length = trxstat.st_size & ~(mtdInfo.erasesize -1); 
     
    258292int main (int argc, char **argv) 
    259293{ 
    260         int ch, i, boot, unlock; 
     294        int ch, i, boot, unlock, trxfd; 
    261295        char *erase[MAX_ARGS], *device; 
    262296        enum { 
     
    302336                cmd = CMD_WRITE; 
    303337                device = argv[2]; 
     338                /* check trx file before erasing or writing anything */ 
     339                trxfd = trx_check(argv[1], device); 
    304340        } else { 
    305341                usage(); 
     
    324360                        break; 
    325361                case CMD_WRITE: 
    326                         mtd_write(argv[1], device); 
     362                        mtd_write(trxfd, device); 
    327363                        break; 
    328364        } 
Note: See TracChangeset for help on using the changeset viewer.