[IMPROVE] check size before memcpy 10/41910/1
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 19 Jun 2015 06:02:12 +0000 (09:02 +0300)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 19 Jun 2015 06:28:13 +0000 (09:28 +0300)
in kjump and jump

Change-Id: I23683343bc1244f142eccd20bc20ab2037e6a9c9
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
kprobe/arch/arm/swap-asm/swap_kprobes.c
kprobe/arch/x86/swap-asm/swap_kprobes.c

index 313475f..d129af3 100644 (file)
@@ -678,6 +678,10 @@ int set_kjump_cb(struct pt_regs *regs, jumper_cb_t cb, void *data, size_t size)
        if (cb_data == NULL)
                return -ENOMEM;
 
+       /* save data */
+       if (size)
+               memcpy(cb_data->data, data, size);
+
        p = swap_kprobe_running();
        p->ss_addr[smp_processor_id()] = (kprobe_opcode_t *)&kjump_trampoline;
 
@@ -687,8 +691,6 @@ int set_kjump_cb(struct pt_regs *regs, jumper_cb_t cb, void *data, size_t size)
        /* save regs */
        memcpy(&cb_data->regs, regs, sizeof(*regs));
 
-       memcpy(cb_data->data, data, size);
-
        /* save cb_data to r10 */
        regs->ARM_r10 = (long)cb_data;
 
@@ -815,12 +817,17 @@ int set_jump_cb(unsigned long ret_addr, struct pt_regs *regs,
        struct cb_data *cb_data;
 
        cb_data = kmalloc(sizeof(*cb_data) + size, GFP_ATOMIC);
+       if (cb_data == NULL)
+               return -ENOMEM;
 
        /* save data */
+       if (size)
+               memcpy(cb_data->data, data, size);
+
+       /* save info for restore */
        cb_data->ret_addr = ret_addr;
        cb_data->cb = cb;
        cb_data->r0 = regs->ARM_r0;
-       memcpy(cb_data->data, data, size);
 
        /* save cb_data to r0 */
        regs->ARM_r0 = (long)cb_data;
index 0f92db8..6fe1090 100644 (file)
@@ -1058,10 +1058,13 @@ int set_jump_cb(unsigned long ret_addr, struct pt_regs *regs,
                return -ENOMEM;
 
        /* save data */
+       if (size)
+               memcpy(cb_data->data, data, size);
+
+       /* save info for restore */
        cb_data->ret_addr = ret_addr;
        cb_data->cb = cb;
        cb_data->bx = regs->bx;
-       memcpy(cb_data->data, data, size);
 
        /* save cb_data to bx */
        regs->bx = (long)cb_data;