Changeset 280 for ap51-flash
- Timestamp:
- 12/01/11 07:54:33 (6 months ago)
- Location:
- ap51-flash/trunk
- Files:
-
- 2 modified
-
router_images.c (modified) (10 diffs)
-
types.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ap51-flash/trunk/router_images.c
r272 r280 23 23 #include <errno.h> 24 24 #include <unistd.h> 25 #include <ctype.h> 25 26 26 27 #include "types.h" … … 122 123 123 124 static int uboot_verify(struct router_image *router_image, char *buff, 124 int buff_len, int size)125 unsigned int buff_len, int size) 125 126 { 126 127 int ret; … … 174 175 175 176 static int ubnt_verify(struct router_image *router_image, char *buff, 176 int buff_len, int size)177 unsigned int buff_len, int size) 177 178 { 178 179 if (buff_len < 4) … … 220 221 221 222 static int ci_verify(struct router_image *router_image, char *buff, 222 int buff_len, int size)223 unsigned int buff_len, int size) 223 224 { 224 225 unsigned int kernel_size, rootfs_size; … … 284 285 285 286 static int ce_verify_om2p(struct router_image *router_image, char *buff, 286 int buff_len, int size)287 { 288 char name_buff[ 21];287 unsigned int buff_len, int size) 288 { 289 char name_buff[33], md5_buff[33]; 289 290 unsigned int num_files, hdr_offset, file_offset, file_size; 291 unsigned int ce_version = 0, hdr_offset_sec; 290 292 int ret; 291 293 292 hdr_offset = 14;293 294 file_offset = 64 * 1024; 294 295 … … 300 301 return 0; 301 302 302 ret = sscanf(buff, "CE%10s%02x", name_buff, &num_files); 303 if (ret != 2) 304 return 0; 305 306 if (strstr(name_buff, "OM2P") == NULL) 307 return 0; 308 309 while (num_files > 0) { 310 ret = sscanf(buff + hdr_offset, "%20s%08x", name_buff, &file_size); 303 /* the old format does not have a version field */ 304 if (isxdigit(buff[2]) && isxdigit(buff[3])) { 305 ret = sscanf(buff, "CE%02x", &ce_version); 306 if (ret != 1) 307 return 0; 308 } 309 310 switch (ce_version) { 311 case 0: 312 ret = sscanf(buff, "CE%10s%02x", name_buff, &num_files); 311 313 if (ret != 2) 312 314 return 0; 315 316 hdr_offset = 14; 317 hdr_offset_sec = 28; 318 break; 319 case 1: 320 ret = sscanf(buff, "CE%*02x%32s%02x", name_buff, &num_files); 321 if (ret != 2) 322 return 0; 323 324 hdr_offset = 38; 325 hdr_offset_sec = 72; 326 break; 327 default: 328 /* unsupported version */ 329 return 0; 330 } 331 332 if (strstr(name_buff, "OM2P") == NULL) 333 return 0; 334 335 while (num_files > 0) { 336 if (hdr_offset + hdr_offset_sec > buff_len) { 337 fprintf(stderr, "Error - buffer too small to parse CE header\n"); 338 return 0; 339 } 340 341 switch (ce_version) { 342 case 0: 343 ret = sscanf(buff + hdr_offset, "%20s%08x", name_buff, &file_size); 344 if (ret != 2) 345 return 0; 346 347 break; 348 case 1: 349 ret = sscanf(buff + hdr_offset, "%32s%08x%32s", name_buff, &file_size, md5_buff); 350 if (ret != 3) 351 return 0; 352 353 break; 354 } 313 355 314 356 ret = router_image_add_file(router_image, name_buff, file_size, file_size, file_offset); … … 317 359 318 360 file_offset += file_size; 319 hdr_offset += 28;361 hdr_offset += hdr_offset_sec; 320 362 num_files--; 321 363 } … … 421 463 { 422 464 struct router_image **router_image; 423 char file_buff[100], found_consumer = 0; 465 char *file_buff = NULL, found_consumer = 0; 466 unsigned int file_buff_size = 300; 424 467 int fd, file_size, ret = -1, len; 468 469 file_buff = malloc(file_buff_size); 470 if (!file_buff_size) 471 goto out; 425 472 426 473 fd = open(image_path, O_RDONLY | O_BINARY); … … 430 477 } 431 478 432 ret = read(fd, file_buff, sizeof(file_buff));479 ret = read(fd, file_buff, file_buff_size); 433 480 if (ret < 0) { 434 481 fprintf(stderr, "Error - can't read image file '%s': %s\n", image_path, strerror(errno)); … … 468 515 close(fd); 469 516 out: 517 free(file_buff); 470 518 return ret; 471 519 } -
ap51-flash/trunk/types.h
r272 r280 105 105 106 106 struct file_info { 107 char file_name[ 20];107 char file_name[33]; 108 108 unsigned int file_offset; 109 109 unsigned int file_size; … … 114 114 char desc[DESC_MAX_LENGTH]; 115 115 int (*image_init)(void); 116 int (*image_verify)(struct router_image *router_image, char *buff, int buff_len, int size);116 int (*image_verify)(struct router_image *router_image, char *buff, unsigned int buff_len, int size); 117 117 char *path; 118 118 char *embedded_img;
