Heitor Ricardo Alves de Siqueira <hal...@linux.vnet.ibm.com> writes:

> +static void dump_entry_data(struct ipr_dump_entry_header *hdr)
> +{
> +     u32 i;
> +     char *s;
> +
> +     switch (hdr->id) {
> +     case ID_IOA_DUMP:
> +             fprintf(out_fp, "Smart Dump Table Data:\n");
> +             print_sdt(hdr->offset);
> +             break;
> +     case ID_IOA_LOC:
> +             fprintf(out_fp, "IOA Location:\n");
> +             s = dump_map+hdr->offset;
> +             fprintf(out_fp, "\t %.*s\n\n", hdr->len, s);
> +             break;
> +     case ID_DRV_VER:
> +             fprintf(out_fp, "Driver Version:\n");
> +             s = dump_map+hdr->offset;
> +             fprintf(out_fp, "\t %.*s\n\n", hdr->len, s);
> +             break;
> +     case ID_DRV_TRACE:
> +             fprintf(out_fp, "Driver Trace Entries:\n");
> +             print_trace(hdr);
> +             fprintf(out_fp, "\n");
> +             break;
> +     case ID_DRV_TYPE:
> +             fprintf(out_fp, "Driver Type:\n");
> +             memcpy(&i, dump_map+hdr->offset, sizeof(i));
> +             i = TARGET_TO_HOST32(i, hdr->eye_catcher);

Skip the memcpy and convert directly from dump_map+hdr->offset.

> +             fprintf(out_fp, "\t CCIN: 0x%04X\n", i);
> +             memcpy(&i, dump_map+hdr->offset+sizeof(i), sizeof(i));
> +             i = TARGET_TO_HOST32(i, hdr->eye_catcher);

Likewise.

> +             fprintf(out_fp,"\t Adapter firmware Version: "
> +                     " %02X:%02X:%02X:%02X\n\n",
> +                     i >> 24,                /* major release */
> +                     (i & 0x00FF0000) >> 16, /* card type */
> +                     (i & 0x0000FF00) >> 8,  /* minor release 0 */
> +                     i & 0x000000FF);        /* minor release 1 */
> +             break;
> +     case ID_DRV_CTRL_BLK:
> +     case ID_DRV_PEND_OPS:
> +             /* not implemented yet */
> +             fprintf(stderr,
> +                     "Warning: found IPR Control Block or IPR Pending Ops!\n"
> +                     "These are not implemented yet. Skipping...\n");
> +             break;
> +     default:
> +             fprintf(stderr,
> +                     "Warning: did not recognize data identification "
> +                     "(id 0x%08X). Skipping...\n\n", hdr->id);
> +     }
> +}
> +
> +/**
> + * fsize -
> + * @filename:                ipr dump file name
> + *
> + * Returns:
> + *   ipr dump file size
> + **/
> +off_t fsize(const char *filename)
> +{
> +     struct stat st;
> +
> +     if (stat(filename, &st) == 0)
> +             return st.st_size;
> +
> +     fprintf(stderr, "Cannot determine size of %s: %s\n",
> +             filename, strerror(errno));
> +     
> +     return -1;
> +}
> +
> +/**
> + * print_usage -
> + *
> + * Returns:
> + *   nothing
> + **/
> +static void print_usage()
> +{
> +     fprintf(stdout,
> +             "Usage: iprdumpfmt [options] <dump_file> <report_file>\n"
> +             "  Options:\n"
> +             "\t-h --help\tPrint this message\n"
> +             "\t-v --verbose\tPrint verbose trace data\n");
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +     u32 i, offset;
> +     int in_fd;
> +     struct ipr_dump_header hdr;
> +     struct ipr_dump_entry_header entry_hdr;
> +
> +     while (1) {
> +             static struct option long_options[] = {
> +                     {"verbose", no_argument, &verbose_trace, 1},
> +                     {"brief", no_argument, &verbose_trace, 0},
> +                     {"help", no_argument, 0, 'h'},
> +                     {0, 0, 0, 0}
> +             };

Make this struct global.  static keyword has a different meaning when
used inside a function and there is no point in using it here.

> +     dump_map = mmap(NULL, fsize(argv[optind]), PROT_READ, MAP_PRIVATE, 
> in_fd, 0);
> +
> +     read_dump_header(&hdr);
> +     print_dump_header(&hdr);
> +     fprintf(out_fp, "\n");
> +
> +     if (dump_map == MAP_FAILED) {
> +             fprintf(stderr, "Could not map dump file to memory: %s\n",
> +                     strerror(errno));
> +             return errno;
> +     }

In read_dump_header you use dump_map, but you only check if the mmap
failed afterwards.  This will get you a segfault inside read_dump_header
if the mapping fails. Do the verification right after the mmap, before
doing anything else.

> +
> +     offset = hdr.first_entry_offset;
> +     for (i = 0; i < hdr.num_entries; ++i) {
> +             offset = read_entry_header(&entry_hdr, offset);
> +             dump_entry_data(&entry_hdr);
> +     }
> +
> +     return 0;
> +}

-- 
Gabriel Krisman Bertazi


------------------------------------------------------------------------------
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to