mma8452: fix memory corruption bug
author黄涛 <huangtao@rock-chips.com>
Tue, 29 Mar 2011 05:52:02 +0000 (13:52 +0800)
committer黄涛 <huangtao@rock-chips.com>
Tue, 29 Mar 2011 05:52:02 +0000 (13:52 +0800)
BUG kmalloc-4096: Poison overwritten
-----------------------------------------------------------------------------

INFO: 0xd34138d4-0xd34138d4. First byte 0x6a instead of 0x6b
INFO: Allocated in input_allocate_device+0x10/0x98 age=3 cpu=0 pid=1
INFO: Freed in input_dev_release+0x18/0x24 age=0 cpu=0 pid=1
INFO: Slab 0xc02b5240 objects=7 used=5 fp=0xd34130c0 flags=0x40c3
INFO: Object 0xd34130c0 @offset=12480 fp=0xd3416180

drivers/input/gsensor/mma8452.c

index cfa88b9db97dde2f23d601f8086411590a93fa0d..fd11bee374cd0c5d1a2d08b11c7489342116685f 100644 (file)
@@ -627,7 +627,12 @@ static int  mma8452_probe(struct i2c_client *client, const struct i2c_device_id
                       "mma8452_probe: mma8452_init_client failed\n");
                goto exit_request_gpio_irq_failed;
        }
-               
+
+       if (MMA8452_DEVID != mma8452_get_devid(this_client)) {
+               pr_info("mma8452: invalid devid\n");
+               goto exit_invalid_devid;
+       }
+
        mma8452->input_dev = input_allocate_device();
        if (!mma8452->input_dev) {
                err = -ENOMEM;
@@ -678,13 +683,9 @@ static int  mma8452_probe(struct i2c_client *client, const struct i2c_device_id
     mma8452_early_suspend.level = 0x2;
     register_early_suspend(&mma8452_early_suspend);
 #endif
-       if(MMA8452_DEVID == mma8452_get_devid(this_client))
-               printk(KERN_INFO "mma8452 probe ok\n");
-       else
-               goto exit_gsensor_sysfs_init_failed;
-       
 
        mma8452->status = -1;
+       printk(KERN_INFO "mma8452 probe ok\n");
 #if  0 
 //     mma8452_start_test(this_client);
        mma8452_start(client, MMA8452_RATE_12P5);
@@ -698,6 +699,7 @@ exit_misc_device_register_mma8452_device_failed:
 exit_input_register_device_failed:
        input_free_device(mma8452->input_dev);
 exit_input_allocate_device_failed:
+exit_invalid_devid:
     free_irq(client->irq, mma8452);
 exit_request_gpio_irq_failed:
        kfree(mma8452);