]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.6.7/xen-gntdev-don-t-leak-memory-from-ioctl_gntdev_map_grant_ref.patch
Linux 3.6.7
[thirdparty/kernel/stable-queue.git] / releases / 3.6.7 / xen-gntdev-don-t-leak-memory-from-ioctl_gntdev_map_grant_ref.patch
CommitLineData
2d3823c0
GKH
1From a67baeb77375199bbd842fa308cb565164dd1f19 Mon Sep 17 00:00:00 2001
2From: David Vrabel <david.vrabel@citrix.com>
3Date: Wed, 24 Oct 2012 12:39:02 +0100
4Subject: xen/gntdev: don't leak memory from IOCTL_GNTDEV_MAP_GRANT_REF
5
6From: David Vrabel <david.vrabel@citrix.com>
7
8commit a67baeb77375199bbd842fa308cb565164dd1f19 upstream.
9
10map->kmap_ops allocated in gntdev_alloc_map() wasn't freed by
11gntdev_put_map().
12
13Add a gntdev_free_map() helper function to free everything allocated
14by gntdev_alloc_map().
15
16Signed-off-by: David Vrabel <david.vrabel@citrix.com>
17Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
18Signed-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 /* ------------------------------------------------------------------ */