blkparse: Avoid segfault for wrong cpu number.
authorTao Ma <boyu.mt@taobao.com>
Thu, 26 May 2011 19:11:07 +0000 (21:11 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Thu, 26 May 2011 19:11:07 +0000 (21:11 +0200)
Currently we only check the magic number to see whether
a blktrace is valid or not, but Bill Broadley did meet
with a case that the cpu info is wrong with a number
of 1725552676. So in resize_cpu_info, we meet with a
overflow when calculating
size = new_count * sizeof(struct per_cpu_info);
And the program will be either segfault or has the error
of out of memory. Although this is more likely a kernel
problem, the blkparse shoudn't segfault for it.

So this patch just check whether the cpu stored in the
trace is the same as the file, if not, just warn it out
and skip it.

Cc: Jens Axboe <axboe@kernel.dk>
Reported-by: Bill Broadley <bill@broadley.org>
Signed-off-by: Tao Ma <boyu.mt@taobao.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
blkparse.c

index 7ee9f9dcc886e6cf6da757ae67708101f1528a58..817cb313ff26f7e1b52c327d99d649ac0fc06f65 100644 (file)
@@ -2354,6 +2354,12 @@ static int ms_prime(struct ms_stream *msp)
                if (verify_trace(bit))
                        goto err;
 
+               if (bit->cpu != pci->cpu) {
+                       fprintf(stderr, "cpu %d trace info has error cpu %d\n",
+                               pci->cpu, bit->cpu);
+                       continue;
+               }
+
                if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && bit->action != BLK_TN_MESSAGE) {
                        handle_notify(bit);
                        output_binary(bit, sizeof(*bit) + bit->pdu_len);