]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - security/selinux/netlabel.c
USB: serial: garmin_gps: fixes package loss if used from gpsbabel
[linux-2.6-omap-h63xx.git] / security / selinux / netlabel.c
index 8192e8bc9f5aa6665ce37fc219981bab206bb6b9..d243ddc723a55c06c507dbc2cdcca14c425d54f9 100644 (file)
@@ -155,11 +155,20 @@ int selinux_netlbl_skbuff_getsid(struct sk_buff *skb, u32 base_sid, u32 *sid)
        int rc;
        struct netlbl_lsm_secattr secattr;
 
+       if (!netlbl_enabled()) {
+               *sid = SECSID_NULL;
+               return 0;
+       }
+
        netlbl_secattr_init(&secattr);
        rc = netlbl_skbuff_getattr(skb, &secattr);
-       if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE)
+       if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE) {
                rc = security_netlbl_secattr_to_sid(&secattr, base_sid, sid);
-       else
+               if (rc == 0 &&
+                   (secattr.flags & NETLBL_SECATTR_CACHEABLE) &&
+                   (secattr.flags & NETLBL_SECATTR_CACHE))
+                       netlbl_cache_add(skb, &secattr);
+       } else
                *sid = SECSID_NULL;
        netlbl_secattr_destroy(&secattr);
 
@@ -295,12 +304,26 @@ int selinux_netlbl_sock_rcv_skb(struct sk_security_struct *sksec,
        int rc;
        u32 nlbl_sid;
        u32 perm;
+       struct netlbl_lsm_secattr secattr;
 
-       rc = selinux_netlbl_skbuff_getsid(skb, SECINITSID_NETMSG, &nlbl_sid);
+       if (!netlbl_enabled())
+               return 0;
+
+       netlbl_secattr_init(&secattr);
+       rc = netlbl_skbuff_getattr(skb, &secattr);
+       if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE) {
+               rc = security_netlbl_secattr_to_sid(&secattr,
+                                                   SECINITSID_NETMSG,
+                                                   &nlbl_sid);
+               if (rc == 0 &&
+                   (secattr.flags & NETLBL_SECATTR_CACHEABLE) &&
+                   (secattr.flags & NETLBL_SECATTR_CACHE))
+                       netlbl_cache_add(skb, &secattr);
+       } else
+               nlbl_sid = SECINITSID_UNLABELED;
+       netlbl_secattr_destroy(&secattr);
        if (rc != 0)
                return rc;
-       if (nlbl_sid == SECSID_NULL)
-               nlbl_sid = SECINITSID_UNLABELED;
 
        switch (sksec->sclass) {
        case SECCLASS_UDP_SOCKET: