]> Git Repo - J-linux.git/commitdiff
pvcalls-front: fix potential null dereference
authorWen Yang <[email protected]>
Tue, 15 Jan 2019 02:31:27 +0000 (10:31 +0800)
committerBoris Ostrovsky <[email protected]>
Tue, 15 Jan 2019 21:13:47 +0000 (16:13 -0500)
 static checker warning:
    drivers/xen/pvcalls-front.c:373 alloc_active_ring()
    error: we previously assumed 'map->active.ring' could be null
           (see line 357)

drivers/xen/pvcalls-front.c
    351 static int alloc_active_ring(struct sock_mapping *map)
    352 {
    353     void *bytes;
    354
    355     map->active.ring = (struct pvcalls_data_intf *)
    356         get_zeroed_page(GFP_KERNEL);
    357     if (!map->active.ring)
                    ^^^^^^^^^^^^^^^^^
Check

    358         goto out;
    359
    360     map->active.ring->ring_order = PVCALLS_RING_ORDER;
    361     bytes = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
    362                     PVCALLS_RING_ORDER);
    363     if (!bytes)
    364         goto out;
    365
    366     map->active.data.in = bytes;
    367     map->active.data.out = bytes +
    368         XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER);
    369
    370     return 0;
    371
    372 out:
--> 373     free_active_ring(map);
                                 ^^^
Add null check on map->active.ring before dereferencing it to avoid
any NULL pointer dereferences.

Fixes: 9f51c05dc41a ("pvcalls-front: Avoid get_free_pages(GFP_KERNEL) under spinlock")
Reported-by: Dan Carpenter <[email protected]>
Suggested-by: Boris Ostrovsky <[email protected]>
Signed-off-by: Wen Yang <[email protected]>
Reviewed-by: Boris Ostrovsky <[email protected]>
CC: Boris Ostrovsky <[email protected]>
CC: Juergen Gross <[email protected]>
CC: Stefano Stabellini <[email protected]>
CC: Dan Carpenter <[email protected]>
CC: [email protected]
CC: [email protected]
Signed-off-by: Boris Ostrovsky <[email protected]>
drivers/xen/pvcalls-front.c

index 307861f9e485724f3f747d4c99f4967db7966f6c..8a249c95c19342059d9eb06dcf1aeb74f4936458 100644 (file)
@@ -343,6 +343,9 @@ int pvcalls_front_socket(struct socket *sock)
 
 static void free_active_ring(struct sock_mapping *map)
 {
+       if (!map->active.ring)
+               return;
+
        free_pages((unsigned long)map->active.data.in,
                        map->active.ring->ring_order);
        free_page((unsigned long)map->active.ring);
This page took 0.054322 seconds and 4 git commands to generate.