Commit cde3b1b6 authored by Christian Göttsche's avatar Christian Göttsche Committed by Paul Moore
Browse files

selinux: unify OOM handling in network hashtables



For network objects, like interfaces, nodes, port and InfiniBands, the
object to SID lookup is cached in hashtables.  OOM during such hashtable
additions of new objects is considered non-fatal and the computed SID is
simply returned without adding the compute result into the hash table.

Actually ignore OOM in the InfiniBand code, despite the comment already
suggesting to do so.  This reverts commit c350f8be ("selinux: Fix
error return code in sel_ib_pkey_sid_slow()").

Add comments in the other places.

Use kmalloc() instead of kzalloc(), since all members are initialized on
success and the data is only used in internbal hash tables, so no risk
of information leakage to userspace.

Fixes: c350f8be ("selinux: Fix error return code in sel_ib_pkey_sid_slow()")
Signed-off-by: default avatarChristian Göttsche <cgzones@googlemail.com>
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent e6fb56b2
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ static int sel_ib_pkey_sid_slow(u64 subnet_prefix, u16 pkey_num, u32 *sid)
{
	int ret;
	struct sel_ib_pkey *pkey;
	struct sel_ib_pkey *new = NULL;
	struct sel_ib_pkey *new;
	unsigned long flags;

	spin_lock_irqsave(&sel_ib_pkey_lock, flags);
@@ -146,12 +146,11 @@ static int sel_ib_pkey_sid_slow(u64 subnet_prefix, u16 pkey_num, u32 *sid)
	if (ret)
		goto out;

	new = kmalloc(sizeof(*new), GFP_ATOMIC);
	if (!new) {
		/* If this memory allocation fails still return 0. The SID
		 * is valid, it just won't be added to the cache.
		 */
	new = kzalloc(sizeof(*new), GFP_ATOMIC);
	if (!new) {
		ret = -ENOMEM;
		goto out;
	}

+5 −1
Original line number Diff line number Diff line
@@ -156,7 +156,11 @@ static int sel_netif_sid_slow(struct net *ns, int ifindex, u32 *sid)
	ret = security_netif_sid(dev->name, sid);
	if (ret != 0)
		goto out;
	new = kzalloc(sizeof(*new), GFP_ATOMIC);

	/* If this memory allocation fails still return 0. The SID
	 * is valid, it just won't be added to the cache.
	 */
	new = kmalloc(sizeof(*new), GFP_ATOMIC);
	if (new) {
		new->nsec.ns = ns;
		new->nsec.ifindex = ifindex;
+4 −1
Original line number Diff line number Diff line
@@ -201,7 +201,10 @@ static int sel_netnode_sid_slow(const void *addr, u16 family, u32 *sid)
		return 0;
	}

	new = kzalloc(sizeof(*new), GFP_ATOMIC);
	/* If this memory allocation fails still return 0. The SID
	 * is valid, it just won't be added to the cache.
	 */
	new = kmalloc(sizeof(*new), GFP_ATOMIC);
	switch (family) {
	case PF_INET:
		ret = security_node_sid(PF_INET,
+5 −1
Original line number Diff line number Diff line
@@ -151,7 +151,11 @@ static int sel_netport_sid_slow(u8 protocol, u16 pnum, u32 *sid)
	ret = security_port_sid(protocol, pnum, sid);
	if (ret != 0)
		goto out;
	new = kzalloc(sizeof(*new), GFP_ATOMIC);

	/* If this memory allocation fails still return 0. The SID
	 * is valid, it just won't be added to the cache.
	 */
	new = kmalloc(sizeof(*new), GFP_ATOMIC);
	if (new) {
		new->psec.port = pnum;
		new->psec.protocol = protocol;