On Tue, 27 Jun 2006, James Morris wrote:
> I'll address that in a patch to follow. Could you please test these
> updated patches? Thanks.
>
Below is a relative patch which only compiles this stuff into the core
networking code when appropriate kernel config is selected.
Please review.
---
diff -purN -X dontdiff linux-2.6.p/include/net/scm.h
linux-2.6.w/include/net/scm.h
--- linux-2.6.p/include/net/scm.h 2006-06-27 02:26:02.000000000 -0400
+++ linux-2.6.w/include/net/scm.h 2006-06-27 03:03:30.000000000 -0400
@@ -19,7 +19,9 @@ struct scm_cookie
{
struct ucred creds; /* Skb credentials */
struct scm_fp_list *fp; /* Passed files */
+#ifdef CONFIG_SECURITY_NETWORK
char *secdata; /* Security context */
+#endif
unsigned long seq; /* Connection seqno */
};
@@ -49,6 +51,17 @@ static __inline__ int scm_send(struct so
return __scm_send(sock, msg, scm);
}
+#ifdef CONFIG_SECURITY_NETWORK
+static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct
scm_cookie *scm)
+{
+ if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL)
+ put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, strlen(scm->secdata)+1,
scm->secdata);
+}
+#else
+static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct
scm_cookie *scm)
+{ }
+#endif /* CONFIG_SECURITY_NETWORK */
+
static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
struct scm_cookie *scm, int flags)
{
@@ -63,8 +76,7 @@ static __inline__ void scm_recv(struct s
if (test_bit(SOCK_PASSCRED, &sock->flags))
put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds),
&scm->creds);
- if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL)
- put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, strlen(scm->secdata)+1,
scm->secdata);
+ scm_passec(sock, msg, scm);
if (!scm->fp)
return;
diff -purN -X dontdiff linux-2.6.p/net/unix/af_unix.c
linux-2.6.w/net/unix/af_unix.c
--- linux-2.6.p/net/unix/af_unix.c 2006-06-27 02:26:02.000000000 -0400
+++ linux-2.6.w/net/unix/af_unix.c 2006-06-27 03:03:29.000000000 -0400
@@ -128,6 +128,28 @@ static atomic_t unix_nr_socks = ATOMIC_I
#define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE)
+#ifdef CONFIG_SECURITY_NETWORKING
+static void unix_get_peersec_dgram(struct sk_buff *skb)
+{
+ int tmp = 0;
+
+ err = security_socket_getpeersec_dgram(skb, UNIXSEC(skb), &tmp);
+ if (err)
+ *(UNIXSEC(skb)) = NULL;
+}
+
+static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff
*skb)
+{
+ scm->secdata = *UNIXSEC(skb);
+}
+#else
+static void unix_get_peersec_dgram(struct sk_buff *skb)
+{ }
+
+static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff
*skb)
+{ }
+#endif /* CONFIG_SECURITY_NETWORKING */
+
/*
* SMP locking strategy:
* hash table is protected with spinlock unix_table_lock
@@ -1251,7 +1273,6 @@ static int unix_dgram_sendmsg(struct kio
struct sk_buff *skb;
long timeo;
struct scm_cookie tmp_scm;
- int seclen = 0;
if (NULL == siocb->scm)
siocb->scm = &tmp_scm;
@@ -1291,9 +1312,8 @@ static int unix_dgram_sendmsg(struct kio
memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
if (siocb->scm->fp)
unix_attach_fds(siocb->scm, skb);
- err = security_socket_getpeersec_dgram(skb, UNIXSEC(skb), &seclen);
- if (err)
- *(UNIXSEC(skb)) = NULL;
+
+ unix_get_peersec_dgram(skb);
skb->h.raw = skb->data;
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
@@ -1574,7 +1594,7 @@ static int unix_dgram_recvmsg(struct kio
memset(&tmp_scm, 0, sizeof(tmp_scm));
}
siocb->scm->creds = *UNIXCREDS(skb);
- siocb->scm->secdata = *UNIXSEC(skb);
+ unix_set_secdata(siocb->scm, skb);
if (!(flags & MSG_PEEK))
{
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html