]>
Commit | Line | Data |
---|---|---|
2d3823c0 GKH |
1 | From a67baeb77375199bbd842fa308cb565164dd1f19 Mon Sep 17 00:00:00 2001 |
2 | From: David Vrabel <david.vrabel@citrix.com> | |
3 | Date: Wed, 24 Oct 2012 12:39:02 +0100 | |
4 | Subject: xen/gntdev: don't leak memory from IOCTL_GNTDEV_MAP_GRANT_REF | |
5 | ||
6 | From: David Vrabel <david.vrabel@citrix.com> | |
7 | ||
8 | commit a67baeb77375199bbd842fa308cb565164dd1f19 upstream. | |
9 | ||
10 | map->kmap_ops allocated in gntdev_alloc_map() wasn't freed by | |
11 | gntdev_put_map(). | |
12 | ||
13 | Add a gntdev_free_map() helper function to free everything allocated | |
14 | by gntdev_alloc_map(). | |
15 | ||
16 | Signed-off-by: David Vrabel <david.vrabel@citrix.com> | |
17 | Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | |
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
19 | ||
20 | --- | |
21 | drivers/xen/gntdev.c | 36 +++++++++++++++++++----------------- | |
22 | 1 file changed, 19 insertions(+), 17 deletions(-) | |
23 | ||
24 | --- a/drivers/xen/gntdev.c | |
25 | +++ b/drivers/xen/gntdev.c | |
26 | @@ -105,6 +105,21 @@ static void gntdev_print_maps(struct gnt | |
27 | #endif | |
28 | } | |
29 | ||
30 | +static void gntdev_free_map(struct grant_map *map) | |
31 | +{ | |
32 | + if (map == NULL) | |
33 | + return; | |
34 | + | |
35 | + if (map->pages) | |
36 | + free_xenballooned_pages(map->count, map->pages); | |
37 | + kfree(map->pages); | |
38 | + kfree(map->grants); | |
39 | + kfree(map->map_ops); | |
40 | + kfree(map->unmap_ops); | |
41 | + kfree(map->kmap_ops); | |
42 | + kfree(map); | |
43 | +} | |
44 | + | |
45 | static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count) | |
46 | { | |
47 | struct grant_map *add; | |
48 | @@ -142,12 +157,7 @@ static struct grant_map *gntdev_alloc_ma | |
49 | return add; | |
50 | ||
51 | err: | |
52 | - kfree(add->pages); | |
53 | - kfree(add->grants); | |
54 | - kfree(add->map_ops); | |
55 | - kfree(add->unmap_ops); | |
56 | - kfree(add->kmap_ops); | |
57 | - kfree(add); | |
58 | + gntdev_free_map(add); | |
59 | return NULL; | |
60 | } | |
61 | ||
62 | @@ -198,17 +208,9 @@ static void gntdev_put_map(struct grant_ | |
63 | evtchn_put(map->notify.event); | |
64 | } | |
65 | ||
66 | - if (map->pages) { | |
67 | - if (!use_ptemod) | |
68 | - unmap_grant_pages(map, 0, map->count); | |
69 | - | |
70 | - free_xenballooned_pages(map->count, map->pages); | |
71 | - } | |
72 | - kfree(map->pages); | |
73 | - kfree(map->grants); | |
74 | - kfree(map->map_ops); | |
75 | - kfree(map->unmap_ops); | |
76 | - kfree(map); | |
77 | + if (map->pages && !use_ptemod) | |
78 | + unmap_grant_pages(map, 0, map->count); | |
79 | + gntdev_free_map(map); | |
80 | } | |
81 | ||
82 | /* ------------------------------------------------------------------ */ |