Hi,

Thanks for the updates.  I am testing the code now.  Some minor fixes (so 
far):

changed all

#ifdef CONFIG_SECURITY_NETWORKING

to

#ifdef CONFIG_SECURITY_NETWORK

cheers,
Catherine


James Morris <[EMAIL PROTECTED]> wrote on 06/27/2006 09:57:15 AM:

> On Tue, 27 Jun 2006, Stephen Smalley wrote:
> 
> > What about saving the u32 seclen with the secdata, and using it later
> > rather than recomputing strlen(secdata)?  That also avoids encoding an
> > assumption in the af_unix code about the content of the data (i.e.
> > NUL-terminated string), leaving that to the security module.
> 
> Ok, this and other issues are addressed in the patch below, which is now 

> back to a single patch.
> 
> I also #ifdef'd the security fields in struct unix_skb_parms.
> 
> Please review and test.
> 
> ---
> 
>  include/asm-alpha/socket.h   |    1 +
>  include/asm-arm/socket.h     |    1 +
>  include/asm-arm26/socket.h   |    1 +
>  include/asm-cris/socket.h    |    1 +
>  include/asm-frv/socket.h     |    1 +
>  include/asm-h8300/socket.h   |    1 +
>  include/asm-i386/socket.h    |    1 +
>  include/asm-ia64/socket.h    |    1 +
>  include/asm-m32r/socket.h    |    1 +
>  include/asm-m68k/socket.h    |    1 +
>  include/asm-mips/socket.h    |    1 +
>  include/asm-parisc/socket.h  |    1 +
>  include/asm-powerpc/socket.h |    1 +
>  include/asm-s390/socket.h    |    1 +
>  include/asm-sh/socket.h      |    1 +
>  include/asm-sparc/socket.h   |    1 +
>  include/asm-sparc64/socket.h |    1 +
>  include/asm-v850/socket.h    |    1 +
>  include/asm-x86_64/socket.h  |    1 +
>  include/asm-xtensa/socket.h  |    1 +
>  include/linux/net.h          |    1 +
>  include/linux/selinux.h      |   15 +++++++++++++++
>  include/net/af_unix.h        |    7 +++++++
>  include/net/scm.h            |   17 +++++++++++++++++
>  net/core/sock.c              |   11 +++++++++++
>  net/unix/af_unix.c           |   25 +++++++++++++++++++++++++
>  security/selinux/exports.c   |   11 +++++++++++
>  security/selinux/hooks.c     |    8 +++++++-
>  28 files changed, 114 insertions(+), 1 deletion(-)
> 
> diff -purN -X dontdiff linux-2.6.o/include/asm-alpha/socket.h 
> linux-2.6.w/include/asm-alpha/socket.h
> --- linux-2.6.o/include/asm-alpha/socket.h   2006-06-21 00:02:08.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-alpha/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -51,6 +51,7 @@
>  #define SCM_TIMESTAMP      SO_TIMESTAMP
> 
>  #define SO_PEERSEC      30
> +#define SO_PASSSEC      34
> 
>  /* Security levels - as per NRL IPv6 - don't actually do anything */
>  #define SO_SECURITY_AUTHENTICATION      19
> diff -purN -X dontdiff linux-2.6.o/include/asm-arm/socket.h linux-2.
> 6.w/include/asm-arm/socket.h
> --- linux-2.6.o/include/asm-arm/socket.h   2006-06-21 00:02:10.000000000 
-0400
> +++ linux-2.6.w/include/asm-arm/socket.h   2006-06-27 02:08:49.000000000 
-0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-arm26/socket.h 
> linux-2.6.w/include/asm-arm26/socket.h
> --- linux-2.6.o/include/asm-arm26/socket.h   2006-06-21 00:02:10.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-arm26/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-cris/socket.h 
> linux-2.6.w/include/asm-cris/socket.h
> --- linux-2.6.o/include/asm-cris/socket.h   2006-06-21 00:02:11.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-cris/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -50,6 +50,7 @@
>  #define SO_ACCEPTCONN          30
> 
>  #define SO_PEERSEC             31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> 
> diff -purN -X dontdiff linux-2.6.o/include/asm-frv/socket.h linux-2.
> 6.w/include/asm-frv/socket.h
> --- linux-2.6.o/include/asm-frv/socket.h   2006-06-21 00:02:11.000000000 
-0400
> +++ linux-2.6.w/include/asm-frv/socket.h   2006-06-27 02:08:49.000000000 
-0400
> @@ -48,6 +48,7 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> 
> diff -purN -X dontdiff linux-2.6.o/include/asm-h8300/socket.h 
> linux-2.6.w/include/asm-h8300/socket.h
> --- linux-2.6.o/include/asm-h8300/socket.h   2006-06-21 00:02:11.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-h8300/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-i386/socket.h 
> linux-2.6.w/include/asm-i386/socket.h
> --- linux-2.6.o/include/asm-i386/socket.h   2006-06-21 00:02:12.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-i386/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-ia64/socket.h 
> linux-2.6.w/include/asm-ia64/socket.h
> --- linux-2.6.o/include/asm-ia64/socket.h   2006-06-21 00:02:12.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-ia64/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -57,5 +57,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC             31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_IA64_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-m32r/socket.h 
> linux-2.6.w/include/asm-m32r/socket.h
> --- linux-2.6.o/include/asm-m32r/socket.h   2006-06-21 00:02:13.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-m32r/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_M32R_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-m68k/socket.h 
> linux-2.6.w/include/asm-m68k/socket.h
> --- linux-2.6.o/include/asm-m68k/socket.h   2006-06-21 00:02:13.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-m68k/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC             31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-mips/socket.h 
> linux-2.6.w/include/asm-mips/socket.h
> --- linux-2.6.o/include/asm-mips/socket.h   2006-06-21 00:02:15.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-mips/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -69,6 +69,7 @@ To add: #define SO_REUSEPORT 0x0200   /* A
>  #define SO_PEERSEC      30
>  #define SO_SNDBUFFORCE      31
>  #define SO_RCVBUFFORCE      33
> +#define SO_PASSSEC      34
> 
>  #ifdef __KERNEL__
> 
> diff -purN -X dontdiff linux-2.6.o/include/asm-parisc/socket.h 
> linux-2.6.w/include/asm-parisc/socket.h
> --- linux-2.6.o/include/asm-parisc/socket.h   2006-06-21 00:02:15.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-parisc/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      0x401c
> 
>  #define SO_PEERSEC      0x401d
> +#define SO_PASSSEC      0x401e
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-powerpc/socket.h 
> linux-2.6.w/include/asm-powerpc/socket.h
> --- linux-2.6.o/include/asm-powerpc/socket.h   2006-06-21 00:02:16.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-powerpc/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -55,5 +55,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif   /* _ASM_POWERPC_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-s390/socket.h 
> linux-2.6.w/include/asm-s390/socket.h
> --- linux-2.6.o/include/asm-s390/socket.h   2006-06-21 00:02:17.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-s390/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -56,5 +56,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-sh/socket.h linux-2.
> 6.w/include/asm-sh/socket.h
> --- linux-2.6.o/include/asm-sh/socket.h   2006-06-21 00:02:17.000000000 
-0400
> +++ linux-2.6.w/include/asm-sh/socket.h   2006-06-27 02:08:49.000000000 
-0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* __ASM_SH_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-sparc/socket.h 
> linux-2.6.w/include/asm-sparc/socket.h
> --- linux-2.6.o/include/asm-sparc/socket.h   2006-06-21 00:02:18.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-sparc/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,6 +48,7 @@
>  #define SCM_TIMESTAMP      SO_TIMESTAMP
> 
>  #define SO_PEERSEC      0x001e
> +#define SO_PASSSEC      0x001f
> 
>  /* Security levels - as per NRL IPv6 - don't actually do anything */
>  #define SO_SECURITY_AUTHENTICATION      0x5001
> diff -purN -X dontdiff linux-2.6.o/include/asm-sparc64/socket.h 
> linux-2.6.w/include/asm-sparc64/socket.h
> --- linux-2.6.o/include/asm-sparc64/socket.h   2006-06-21 00:02:19.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-sparc64/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,6 +48,7 @@
>  #define SCM_TIMESTAMP      SO_TIMESTAMP
> 
>  #define SO_PEERSEC      0x001e
> +#define SO_PASSSEC      0x001f
> 
>  /* Security levels - as per NRL IPv6 - don't actually do anything */
>  #define SO_SECURITY_AUTHENTICATION      0x5001
> diff -purN -X dontdiff linux-2.6.o/include/asm-v850/socket.h 
> linux-2.6.w/include/asm-v850/socket.h
> --- linux-2.6.o/include/asm-v850/socket.h   2006-06-21 00:02:20.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-v850/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif /* __V850_SOCKET_H__ */
> diff -purN -X dontdiff linux-2.6.o/include/asm-x86_64/socket.h 
> linux-2.6.w/include/asm-x86_64/socket.h
> --- linux-2.6.o/include/asm-x86_64/socket.h   2006-06-21 00:02:20.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-x86_64/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -48,5 +48,6 @@
>  #define SO_ACCEPTCONN      30
> 
>  #define SO_PEERSEC             31
> +#define SO_PASSSEC      34
> 
>  #endif /* _ASM_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/asm-xtensa/socket.h 
> linux-2.6.w/include/asm-xtensa/socket.h
> --- linux-2.6.o/include/asm-xtensa/socket.h   2006-06-21 00:02:21.
> 000000000 -0400
> +++ linux-2.6.w/include/asm-xtensa/socket.h   2006-06-27 02:08:49.
> 000000000 -0400
> @@ -59,5 +59,6 @@
> 
>  #define SO_ACCEPTCONN      30
>  #define SO_PEERSEC      31
> +#define SO_PASSSEC      34
> 
>  #endif   /* _XTENSA_SOCKET_H */
> diff -purN -X dontdiff linux-2.6.o/include/linux/net.h linux-2.6.
> w/include/linux/net.h
> --- linux-2.6.o/include/linux/net.h   2006-06-21 00:02:23.000000000 
-0400
> +++ linux-2.6.w/include/linux/net.h   2006-06-27 02:08:49.000000000 
-0400
> @@ -61,6 +61,7 @@ typedef enum {
>  #define SOCK_ASYNC_WAITDATA   1
>  #define SOCK_NOSPACE      2
>  #define SOCK_PASSCRED      3
> +#define SOCK_PASSSEC      4
> 
>  #ifndef ARCH_HAS_SOCKET_TYPES
>  /**
> diff -purN -X dontdiff linux-2.6.o/include/linux/selinux.h linux-2.
> 6.w/include/linux/selinux.h
> --- linux-2.6.o/include/linux/selinux.h   2006-06-21 00:02:23.000000000 
-0400
> +++ linux-2.6.w/include/linux/selinux.h   2006-06-27 02:18:47.000000000 
-0400
> @@ -18,6 +18,7 @@ struct selinux_audit_rule;
>  struct audit_context;
>  struct inode;
>  struct kern_ipc_perm;
> +struct socket;
> 
>  #ifdef CONFIG_SECURITY_SELINUX
> 
> @@ -119,6 +120,15 @@ void selinux_get_ipc_sid(const struct ke
>  void selinux_get_task_sid(struct task_struct *tsk, u32 *sid);
> 
>  /**
> + *     selinux_get_sock_sid - return the SID of socket
> + *     @sock: the socket whose SID will be returned
> + *     @sid: pointer to security context ID to be filled in.
> + *
> + *     Returns nothing
> + */
> +void selinux_get_sock_sid(struct socket *sock, u32 *sid);
> +
> +/**
>   *     selinux_string_to_sid - map a security context string to a 
security ID
>   *     @str: the security context string to be mapped
>   *     @sid: ID value returned via this.
> @@ -193,6 +203,11 @@ static inline void selinux_get_task_sid(
>     *sid = 0;
>  }
> 
> +static inline void selinux_get_sock_sid(struct socket *sock, u32 *sid)
> +{
> +   *sid = 0;
> +}
> +
>  static inline int selinux_string_to_sid(const char *str, u32 *sid)
>  {
>         *sid = 0;
> diff -purN -X dontdiff linux-2.6.o/include/net/af_unix.h linux-2.6.
> w/include/net/af_unix.h
> --- linux-2.6.o/include/net/af_unix.h   2006-06-21 00:02:24.000000000 
-0400
> +++ linux-2.6.w/include/net/af_unix.h   2006-06-27 09:28:04.000000000 
-0400
> @@ -53,10 +53,17 @@ struct unix_address {
>  struct unix_skb_parms {
>     struct ucred      creds;      /* Skb credentials   */
>     struct scm_fp_list   *fp;      /* Passed files      */
> +#ifdef CONFIG_SECURITY_NETWORKING
> +   char         *secdata;   /* Security context   */
> +   u32         seclen;      /* Security length   */
> +#endif
> + 
>  };
> 
>  #define UNIXCB(skb)    (*(struct unix_skb_parms*)&((skb)->cb))
>  #define UNIXCREDS(skb)   (&UNIXCB((skb)).creds)
> +#define UNIXSECDATA(skb)   (&UNIXCB((skb)).secdata)
> +#define UNIXSECLEN(skb)      (&UNIXCB((skb)).seclen)
> 
>  #define unix_state_rlock(s)   spin_lock(&unix_sk(s)->lock)
>  #define unix_state_runlock(s)   spin_unlock(&unix_sk(s)->lock)
> diff -purN -X dontdiff linux-2.6.o/include/net/scm.h linux-2.6.
> w/include/net/scm.h
> --- linux-2.6.o/include/net/scm.h   2006-06-21 00:02:24.000000000 -0400
> +++ linux-2.6.w/include/net/scm.h   2006-06-27 09:32:27.000000000 -0400
> @@ -19,6 +19,10 @@ struct scm_cookie
>  {
>     struct ucred      creds;      /* Skb credentials   */
>     struct scm_fp_list   *fp;      /* Passed files      */
> +#ifdef CONFIG_SECURITY_NETWORK 
> +   char         *secdata;   /* Security context   */
> +   u32         seclen;      /* Security length   */
> +#endif 
>     unsigned long      seq;      /* Connection seqno   */
>  };
> 
> @@ -48,6 +52,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, scm->seclen, 
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)
>  {
> @@ -62,6 +77,8 @@ 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);
> 
> +   scm_passec(sock, msg, scm);
> +
>     if (!scm->fp)
>        return;
> 
> diff -purN -X dontdiff linux-2.6.o/net/core/sock.c 
linux-2.6.w/net/core/sock.c
> --- linux-2.6.o/net/core/sock.c   2006-06-21 00:02:27.000000000 -0400
> +++ linux-2.6.w/net/core/sock.c   2006-06-27 02:08:49.000000000 -0400
> @@ -565,6 +565,13 @@ set_rcvbuf:
>           ret = -ENONET;
>           break;
> 
> +      case SO_PASSSEC:
> +         if (valbool)
> +            set_bit(SOCK_PASSSEC, &sock->flags);
> +         else
> +            clear_bit(SOCK_PASSSEC, &sock->flags);
> +         break;
> +
>        /* We implement the SO_SNDLOWAT etc to
>           not be settable (1003.1g 5.3) */
>        default:
> @@ -723,6 +730,10 @@ int sock_getsockopt(struct socket *sock,
>           v.val = sk->sk_state == TCP_LISTEN;
>           break;
> 
> +      case SO_PASSSEC:
> +         v.val = test_bit(SOCK_PASSSEC, &sock->flags) ? 1 : 0;
> +         break;
> +
>        case SO_PEERSEC:
>           return security_socket_getpeersec_stream(sock, optval, optlen, 
len);
> 
> diff -purN -X dontdiff linux-2.6.o/net/unix/af_unix.c linux-2.6.
> w/net/unix/af_unix.c
> --- linux-2.6.o/net/unix/af_unix.c   2006-06-21 00:02:30.000000000 -0400
> +++ linux-2.6.w/net/unix/af_unix.c   2006-06-27 09:30:12.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)
> +{
> +   err = security_socket_getpeersec_dgram(skb, UNIXSECDATA(skb),
> +                      UNIXSECLEN(skb));
> +   if (err)
> +      *(UNIXSEC(skb)) = NULL;
> +}
> +
> +static inline void unix_set_secdata(struct scm_cookie *scm, struct 
> sk_buff *skb)
> +{
> +   scm->secdata = *UNIXSECDATA(skb);
> +   scm->seclen = UNIXSECLEN(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
> @@ -1291,6 +1313,8 @@ static int unix_dgram_sendmsg(struct kio
>     if (siocb->scm->fp)
>        unix_attach_fds(siocb->scm, skb);
> 
> +   unix_get_peersec_dgram(skb);
> +
>     skb->h.raw = skb->data;
>     err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
>     if (err)
> @@ -1570,6 +1594,7 @@ static int unix_dgram_recvmsg(struct kio
>        memset(&tmp_scm, 0, sizeof(tmp_scm));
>     }
>     siocb->scm->creds = *UNIXCREDS(skb);
> +   unix_set_secdata(siocb->scm, skb);
> 
>     if (!(flags & MSG_PEEK))
>     {
> diff -purN -X dontdiff linux-2.6.o/security/selinux/exports.c 
> linux-2.6.w/security/selinux/exports.c
> --- linux-2.6.o/security/selinux/exports.c   2006-06-21 00:02:31.
> 000000000 -0400
> +++ linux-2.6.w/security/selinux/exports.c   2006-06-27 02:19:16.
> 000000000 -0400
> @@ -17,6 +17,7 @@
>  #include <linux/selinux.h>
>  #include <linux/fs.h>
>  #include <linux/ipc.h>
> +#include <net/sock.h>
> 
>  #include "security.h"
>  #include "objsec.h"
> @@ -72,6 +73,16 @@ void selinux_get_task_sid(struct task_st
>     *sid = 0;
>  }
> 
> +void selinux_get_sock_sid(struct socket *sock, u32 *sid)
> +{
> +   if (selinux_enabled) {
> +      const struct inode *inode = SOCK_INODE(sock);
> +      selinux_get_inode_sid(inode, sid);
> +      return;
> +   }
> +   *sid = 0;
> +}
> +
>  int selinux_string_to_sid(char *str, u32 *sid)
>  {
>     if (selinux_enabled)
> diff -purN -X dontdiff linux-2.6.o/security/selinux/hooks.c linux-2.
> 6.w/security/selinux/hooks.c
> --- linux-2.6.o/security/selinux/hooks.c   2006-06-26 14:47:31.000000000 
-0400
> +++ linux-2.6.w/security/selinux/hooks.c   2006-06-27 02:08:49.000000000 
-0400
> @@ -69,6 +69,7 @@
>  #include <linux/sysctl.h>
>  #include <linux/audit.h>
>  #include <linux/string.h>
> +#include <linux/selinux.h>
> 
>  #include "avc.h"
>  #include "objsec.h"
> @@ -3418,7 +3419,12 @@ out: 
>  static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, 
> char **secdata, u32 *seclen)
>  {
>     int err = 0;
> -   u32 peer_sid = selinux_socket_getpeer_dgram(skb);
> +   u32 peer_sid;
> +
> +   if (skb->sk->sk_family == PF_UNIX)
> +      selinux_get_sock_sid(skb->sk->sk_socket, &peer_sid);
> +   else
> +      peer_sid = selinux_socket_getpeer_dgram(skb);
> 
>     if (peer_sid == SECSID_NULL)
>        return -EINVAL;

-
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

Reply via email to