]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
xen: validate type and value of the dtor argument of SetPageForeign()
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 18 Mar 2008 11:13:37 +0000 (11:13 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 18 Mar 2008 11:13:37 +0000 (11:13 +0000)
Linux 2.6.25 changes the protoype of pte_free() etc., resulting in
those functions no longer be suitable as a PageForeign destructor. I
had to find out by way of analysing a crash, but for the future it'd
be much better if the build would already indicate a problem with
this.

At the same time, also check the destructor supplied is not NULL.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
include/linux/page-flags.h

index f50f6559c510ba84d05e14e03d9f9a1b024a6c34..033e4c3b5e6b16fe5e07250e5f690125024d75e2 100644 (file)
 #define ClearPageUncached(page)        clear_bit(PG_uncached, &(page)->flags)
 
 #define PageForeign(page)      test_bit(PG_foreign, &(page)->flags)
-#define SetPageForeign(page, dtor) do {                \
-       set_bit(PG_foreign, &(page)->flags);    \
-       (page)->index = (long)(dtor);           \
+#define SetPageForeign(_page, dtor) do {               \
+       set_bit(PG_foreign, &(_page)->flags);           \
+       BUG_ON((dtor) == (void (*)(struct page *))0);   \
+       (_page)->index = (long)(dtor);                  \
 } while (0)
-#define ClearPageForeign(page) do {            \
-       clear_bit(PG_foreign, &(page)->flags);  \
-       (page)->index = 0;                      \
+#define ClearPageForeign(page) do {                    \
+       clear_bit(PG_foreign, &(page)->flags);          \
+       (page)->index = 0;                              \
 } while (0)
-#define PageForeignDestructor(page)            \
-       ( (void (*) (struct page *)) (page)->index )(page)
+#define PageForeignDestructor(_page)                   \
+       ((void (*)(struct page *))(_page)->index)(_page)
 
 struct page;   /* forward declaration */