X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=security%2Fselinux%2Fss%2Fsidtab.c;h=77d000246f13724ce12e6d4ffb86085c110fbbf9;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=69e035a6244d59a85351f055eed0f0a028912932;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/security/selinux/ss/sidtab.c b/security/selinux/ss/sidtab.c index 69e035a62..77d000246 100644 --- a/security/selinux/ss/sidtab.c +++ b/security/selinux/ss/sidtab.c @@ -16,8 +16,8 @@ (sid & SIDTAB_HASH_MASK) #define INIT_SIDTAB_LOCK(s) spin_lock_init(&s->lock) -#define SIDTAB_LOCK(s) spin_lock_irq(&s->lock) -#define SIDTAB_UNLOCK(s) spin_unlock_irq(&s->lock) +#define SIDTAB_LOCK(s, x) spin_lock_irqsave(&s->lock, x) +#define SIDTAB_UNLOCK(s, x) spin_unlock_irqrestore(&s->lock, x) int sidtab_init(struct sidtab *s) { @@ -237,12 +237,13 @@ int sidtab_context_to_sid(struct sidtab *s, { u32 sid; int ret = 0; + unsigned long flags; *out_sid = SECSID_NULL; sid = sidtab_search_context(s, context); if (!sid) { - SIDTAB_LOCK(s); + SIDTAB_LOCK(s, flags); /* Rescan now that we hold the lock. */ sid = sidtab_search_context(s, context); if (sid) @@ -257,7 +258,7 @@ int sidtab_context_to_sid(struct sidtab *s, if (ret) s->next_sid--; unlock_out: - SIDTAB_UNLOCK(s); + SIDTAB_UNLOCK(s, flags); } if (ret) @@ -320,17 +321,21 @@ void sidtab_destroy(struct sidtab *s) void sidtab_set(struct sidtab *dst, struct sidtab *src) { - SIDTAB_LOCK(src); + unsigned long flags; + + SIDTAB_LOCK(src, flags); dst->htable = src->htable; dst->nel = src->nel; dst->next_sid = src->next_sid; dst->shutdown = 0; - SIDTAB_UNLOCK(src); + SIDTAB_UNLOCK(src, flags); } void sidtab_shutdown(struct sidtab *s) { - SIDTAB_LOCK(s); + unsigned long flags; + + SIDTAB_LOCK(s, flags); s->shutdown = 1; - SIDTAB_UNLOCK(s); + SIDTAB_UNLOCK(s, flags); }