aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Cooper <andrew.cooper3@citrix.com>2013-10-22 17:16:29 +0200
committerJan Beulich <jbeulich@suse.com>2013-10-22 17:16:29 +0200
commit170fa9967176c8627fe2e75dbe1dc5212019afde (patch)
treec180aaacd832ee4357a97143c3bb643fc9733a19
parent782dcf5c502ce089d13eaa92e1c6c324f751df16 (diff)
downloadxen-170fa9967176c8627fe2e75dbe1dc5212019afde.tar.gz
xen-170fa9967176c8627fe2e75dbe1dc5212019afde.tar.bz2
xen-170fa9967176c8627fe2e75dbe1dc5212019afde.zip
spinlock: ensure the flags parameter is wide enoughstaging
Because of the construction of spin_lock_irq() (and varients), the flags parameter could be trucated. Use a BUILD_BUG_ON() to verify the width of the parameter. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Keir Fraser <keir@xen.org> Acked-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r--xen/include/xen/spinlock.h18
1 files changed, 15 insertions, 3 deletions
diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h
index 76581c5cc2..12b0a8927c 100644
--- a/xen/include/xen/spinlock.h
+++ b/xen/include/xen/spinlock.h
@@ -188,7 +188,11 @@ int _rw_is_write_locked(rwlock_t *lock);
#define spin_lock(l) _spin_lock(l)
#define spin_lock_irq(l) _spin_lock_irq(l)
-#define spin_lock_irqsave(l, f) ((f) = _spin_lock_irqsave(l))
+#define spin_lock_irqsave(l, f) \
+ ({ \
+ BUILD_BUG_ON(sizeof(f) != sizeof(unsigned long)); \
+ ((f) = _spin_lock_irqsave(l)); \
+ })
#define spin_unlock(l) _spin_unlock(l)
#define spin_unlock_irq(l) _spin_unlock_irq(l)
@@ -220,7 +224,11 @@ int _rw_is_write_locked(rwlock_t *lock);
#define read_lock(l) _read_lock(l)
#define read_lock_irq(l) _read_lock_irq(l)
-#define read_lock_irqsave(l, f) ((f) = _read_lock_irqsave(l))
+#define read_lock_irqsave(l, f) \
+ ({ \
+ BUILD_BUG_ON(sizeof(f) != sizeof(unsigned long)); \
+ ((f) = _read_lock_irqsave(l)); \
+ })
#define read_unlock(l) _read_unlock(l)
#define read_unlock_irq(l) _read_unlock_irq(l)
@@ -229,7 +237,11 @@ int _rw_is_write_locked(rwlock_t *lock);
#define write_lock(l) _write_lock(l)
#define write_lock_irq(l) _write_lock_irq(l)
-#define write_lock_irqsave(l, f) ((f) = _write_lock_irqsave(l))
+#define write_lock_irqsave(l, f) \
+ ({ \
+ BUILD_BUG_ON(sizeof(f) != sizeof(unsigned long)); \
+ ((f) = _write_lock_irqsave(l)); \
+ })
#define write_trylock(l) _write_trylock(l)
#define write_unlock(l) _write_unlock(l)