summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_export.c12
-rw-r--r--sys/kern/vfs_subr.c12
-rw-r--r--sys/netinet/tcp_subr.c21
-rw-r--r--sys/netinet/tcp_timewait.c21
-rw-r--r--sys/netinet/udp_usrreq.c10
-rw-r--r--sys/netinet6/udp6_usrreq.c14
-rw-r--r--sys/nfs/nfs.h2
-rw-r--r--sys/nfs/nfs_syscalls.c8
-rw-r--r--sys/nfsclient/nfs.h2
-rw-r--r--sys/nfsclient/nfs_nfsiod.c8
-rw-r--r--sys/nfsclient/nfsargs.h2
-rw-r--r--sys/nfsclient/nfsstats.h2
-rw-r--r--sys/nfsserver/nfs.h2
-rw-r--r--sys/nfsserver/nfs_syscalls.c8
-rw-r--r--sys/nfsserver/nfsrvstats.h2
-rw-r--r--sys/sys/mount.h6
-rw-r--r--sys/sys/param.h2
-rw-r--r--sys/sys/ucred.h13
18 files changed, 113 insertions, 34 deletions
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index 38c1895..3c99779 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -2319,7 +2319,11 @@ vfs_hang_addrlist(mp, nep, argp)
return (EPERM);
np = &nep->ne_defexported;
np->netc_exflags = argp->ex_flags;
- np->netc_anon = argp->ex_anon;
+ bzero(&np->netc_anon, sizeof(np->netc_anon));
+ np->netc_anon.cr_uid = argp->ex_anon.cr_uid;
+ np->netc_anon.cr_ngroups = argp->ex_anon.cr_ngroups;
+ bcopy(argp->ex_anon.cr_groups, np->netc_anon.cr_groups,
+ sizeof(np->netc_anon.cr_groups));
np->netc_anon.cr_ref = 1;
mp->mnt_flag |= MNT_DEFEXPORTED;
return (0);
@@ -2363,7 +2367,11 @@ vfs_hang_addrlist(mp, nep, argp)
goto out;
}
np->netc_exflags = argp->ex_flags;
- np->netc_anon = argp->ex_anon;
+ bzero(&np->netc_anon, sizeof(np->netc_anon));
+ np->netc_anon.cr_uid = argp->ex_anon.cr_uid;
+ np->netc_anon.cr_ngroups = argp->ex_anon.cr_ngroups;
+ bcopy(argp->ex_anon.cr_groups, np->netc_anon.cr_groups,
+ sizeof(np->netc_anon.cr_groups));
np->netc_anon.cr_ref = 1;
return (0);
out:
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 38c1895..3c99779 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2319,7 +2319,11 @@ vfs_hang_addrlist(mp, nep, argp)
return (EPERM);
np = &nep->ne_defexported;
np->netc_exflags = argp->ex_flags;
- np->netc_anon = argp->ex_anon;
+ bzero(&np->netc_anon, sizeof(np->netc_anon));
+ np->netc_anon.cr_uid = argp->ex_anon.cr_uid;
+ np->netc_anon.cr_ngroups = argp->ex_anon.cr_ngroups;
+ bcopy(argp->ex_anon.cr_groups, np->netc_anon.cr_groups,
+ sizeof(np->netc_anon.cr_groups));
np->netc_anon.cr_ref = 1;
mp->mnt_flag |= MNT_DEFEXPORTED;
return (0);
@@ -2363,7 +2367,11 @@ vfs_hang_addrlist(mp, nep, argp)
goto out;
}
np->netc_exflags = argp->ex_flags;
- np->netc_anon = argp->ex_anon;
+ bzero(&np->netc_anon, sizeof(np->netc_anon));
+ np->netc_anon.cr_uid = argp->ex_anon.cr_uid;
+ np->netc_anon.cr_ngroups = argp->ex_anon.cr_ngroups;
+ bcopy(argp->ex_anon.cr_groups, np->netc_anon.cr_groups,
+ sizeof(np->netc_anon.cr_groups));
np->netc_anon.cr_ref = 1;
return (0);
out:
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 6541014..7ec8429 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -900,6 +900,7 @@ SYSCTL_PROC(_net_inet_tcp, TCPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
static int
tcp_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct xucred xuc;
struct sockaddr_in addrs[2];
struct inpcb *inp;
int error, s;
@@ -917,19 +918,25 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto out;
}
- error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
+ bzero(&xuc, sizeof(xuc));
+ xuc.cr_uid = inp->inp_socket->so_cred->cr_uid;
+ xuc.cr_ngroups = inp->inp_socket->so_cred->cr_ngroups;
+ bcopy(inp->inp_socket->so_cred->cr_groups, xuc.cr_groups,
+ sizeof(xuc.cr_groups));
+ error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
out:
splx(s);
return (error);
}
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
- 0, 0, tcp_getcred, "S,ucred", "Get the ucred of a TCP connection");
+ 0, 0, tcp_getcred, "S,xucred", "Get the xucred of a TCP connection");
#ifdef INET6
static int
tcp6_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct xucred xuc;
struct sockaddr_in6 addrs[2];
struct inpcb *inp;
int error, s, mapped = 0;
@@ -963,8 +970,12 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto out;
}
- error = SYSCTL_OUT(req, inp->inp_socket->so_cred,
- sizeof(struct ucred));
+ bzero(&xuc, sizeof(xuc));
+ xuc.cr_uid = inp->inp_socket->so_cred->cr_uid;
+ xuc.cr_ngroups = inp->inp_socket->so_cred->cr_ngroups;
+ bcopy(inp->inp_socket->so_cred->cr_groups, xuc.cr_groups,
+ sizeof(xuc.cr_groups));
+ error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
out:
splx(s);
return (error);
@@ -972,7 +983,7 @@ out:
SYSCTL_PROC(_net_inet6_tcp6, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
0, 0,
- tcp6_getcred, "S,ucred", "Get the ucred of a TCP6 connection");
+ tcp6_getcred, "S,xucred", "Get the xucred of a TCP6 connection");
#endif
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index 6541014..7ec8429 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -900,6 +900,7 @@ SYSCTL_PROC(_net_inet_tcp, TCPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
static int
tcp_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct xucred xuc;
struct sockaddr_in addrs[2];
struct inpcb *inp;
int error, s;
@@ -917,19 +918,25 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto out;
}
- error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
+ bzero(&xuc, sizeof(xuc));
+ xuc.cr_uid = inp->inp_socket->so_cred->cr_uid;
+ xuc.cr_ngroups = inp->inp_socket->so_cred->cr_ngroups;
+ bcopy(inp->inp_socket->so_cred->cr_groups, xuc.cr_groups,
+ sizeof(xuc.cr_groups));
+ error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
out:
splx(s);
return (error);
}
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
- 0, 0, tcp_getcred, "S,ucred", "Get the ucred of a TCP connection");
+ 0, 0, tcp_getcred, "S,xucred", "Get the xucred of a TCP connection");
#ifdef INET6
static int
tcp6_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct xucred xuc;
struct sockaddr_in6 addrs[2];
struct inpcb *inp;
int error, s, mapped = 0;
@@ -963,8 +970,12 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto out;
}
- error = SYSCTL_OUT(req, inp->inp_socket->so_cred,
- sizeof(struct ucred));
+ bzero(&xuc, sizeof(xuc));
+ xuc.cr_uid = inp->inp_socket->so_cred->cr_uid;
+ xuc.cr_ngroups = inp->inp_socket->so_cred->cr_ngroups;
+ bcopy(inp->inp_socket->so_cred->cr_groups, xuc.cr_groups,
+ sizeof(xuc.cr_groups));
+ error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
out:
splx(s);
return (error);
@@ -972,7 +983,7 @@ out:
SYSCTL_PROC(_net_inet6_tcp6, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
0, 0,
- tcp6_getcred, "S,ucred", "Get the ucred of a TCP6 connection");
+ tcp6_getcred, "S,xucred", "Get the xucred of a TCP6 connection");
#endif
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 468064f..5588956 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -606,6 +606,7 @@ SYSCTL_PROC(_net_inet_udp, UDPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
static int
udp_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct xucred xuc;
struct sockaddr_in addrs[2];
struct inpcb *inp;
int error, s;
@@ -623,14 +624,19 @@ udp_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto out;
}
- error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
+ bzero(&xuc, sizeof(xuc));
+ xuc.cr_uid = inp->inp_socket->so_cred->cr_uid;
+ xuc.cr_ngroups = inp->inp_socket->so_cred->cr_ngroups;
+ bcopy(inp->inp_socket->so_cred->cr_groups, xuc.cr_groups,
+ sizeof(xuc.cr_groups));
+ error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
out:
splx(s);
return (error);
}
SYSCTL_PROC(_net_inet_udp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
- 0, 0, udp_getcred, "S,ucred", "Get the ucred of a UDP connection");
+ 0, 0, udp_getcred, "S,xucred", "Get the xucred of a UDP connection");
static int
udp_output(inp, m, addr, control, p)
diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c
index bb0ae73..ca9ce2f 100644
--- a/sys/netinet6/udp6_usrreq.c
+++ b/sys/netinet6/udp6_usrreq.c
@@ -474,6 +474,7 @@ udp6_ctlinput(cmd, sa, d)
static int
udp6_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct xucred xuc;
struct sockaddr_in6 addrs[2];
struct inpcb *inp;
int error, s;
@@ -484,7 +485,7 @@ udp6_getcred(SYSCTL_HANDLER_ARGS)
if (req->newlen != sizeof(addrs))
return (EINVAL);
- if (req->oldlen != sizeof(struct ucred))
+ if (req->oldlen != sizeof(struct xucred))
return (EINVAL);
error = SYSCTL_IN(req, addrs, sizeof(addrs));
if (error)
@@ -498,9 +499,12 @@ udp6_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto out;
}
- error = SYSCTL_OUT(req, inp->inp_socket->so_cred,
- sizeof(struct ucred));
-
+ bzero(&xuc, sizeof(xuc));
+ xuc.cr_uid = inp->inp_socket->so_cred->cr_uid;
+ xuc.cr_ngroups = inp->inp_socket->so_cred->cr_ngroups;
+ bcopy(inp->inp_socket->so_cred->cr_groups, xuc.cr_groups,
+ sizeof(xuc.cr_groups));
+ error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
out:
splx(s);
return (error);
@@ -508,7 +512,7 @@ out:
SYSCTL_PROC(_net_inet6_udp6, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
0, 0,
- udp6_getcred, "S,ucred", "Get the ucred of a UDP6 connection");
+ udp6_getcred, "S,xucred", "Get the xucred of a UDP6 connection");
static int
udp6_abort(struct socket *so)
diff --git a/sys/nfs/nfs.h b/sys/nfs/nfs.h
index 5c5a823..6423e5a 100644
--- a/sys/nfs/nfs.h
+++ b/sys/nfs/nfs.h
@@ -197,7 +197,7 @@ struct nfsd_srvargs {
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
uid_t nsd_uid; /* Effective uid mapped to cred */
u_int32_t nsd_haddr; /* Ip address of client */
- struct ucred nsd_cr; /* Cred. uid maps to */
+ struct xucred nsd_cr; /* Cred. uid maps to */
int nsd_authlen; /* Length of auth string (ret) */
u_char *nsd_authstr; /* Auth string (ret) */
int nsd_verflen; /* and the verfier */
diff --git a/sys/nfs/nfs_syscalls.c b/sys/nfs/nfs_syscalls.c
index 4eb5c86..2d46568 100644
--- a/sys/nfs/nfs_syscalls.c
+++ b/sys/nfs/nfs_syscalls.c
@@ -260,7 +260,13 @@ nfssvc(p, uap)
FREE(nuidp->nu_nam, M_SONAME);
}
nuidp->nu_flag = 0;
- nuidp->nu_cr = nsd->nsd_cr;
+ bzero(&nuidp->nu_cr, sizeof(nuidp->nu_cr));
+ nuidp->nu_cr.cr_uid = nsd->nsd_cr.cr_uid;
+ nuidp->nu_cr.cr_ngroups =
+ nsd->nsd_cr.cr_ngroups;
+ bcopy(nsd->nsd_cr.cr_groups,
+ nuidp->nu_cr.cr_groups,
+ sizeof(nuidp->nu_cr.cr_groups));
if (nuidp->nu_cr.cr_ngroups > NGROUPS)
nuidp->nu_cr.cr_ngroups = NGROUPS;
nuidp->nu_cr.cr_ref = 1;
diff --git a/sys/nfsclient/nfs.h b/sys/nfsclient/nfs.h
index 5c5a823..6423e5a 100644
--- a/sys/nfsclient/nfs.h
+++ b/sys/nfsclient/nfs.h
@@ -197,7 +197,7 @@ struct nfsd_srvargs {
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
uid_t nsd_uid; /* Effective uid mapped to cred */
u_int32_t nsd_haddr; /* Ip address of client */
- struct ucred nsd_cr; /* Cred. uid maps to */
+ struct xucred nsd_cr; /* Cred. uid maps to */
int nsd_authlen; /* Length of auth string (ret) */
u_char *nsd_authstr; /* Auth string (ret) */
int nsd_verflen; /* and the verfier */
diff --git a/sys/nfsclient/nfs_nfsiod.c b/sys/nfsclient/nfs_nfsiod.c
index 4eb5c86..2d46568 100644
--- a/sys/nfsclient/nfs_nfsiod.c
+++ b/sys/nfsclient/nfs_nfsiod.c
@@ -260,7 +260,13 @@ nfssvc(p, uap)
FREE(nuidp->nu_nam, M_SONAME);
}
nuidp->nu_flag = 0;
- nuidp->nu_cr = nsd->nsd_cr;
+ bzero(&nuidp->nu_cr, sizeof(nuidp->nu_cr));
+ nuidp->nu_cr.cr_uid = nsd->nsd_cr.cr_uid;
+ nuidp->nu_cr.cr_ngroups =
+ nsd->nsd_cr.cr_ngroups;
+ bcopy(nsd->nsd_cr.cr_groups,
+ nuidp->nu_cr.cr_groups,
+ sizeof(nuidp->nu_cr.cr_groups));
if (nuidp->nu_cr.cr_ngroups > NGROUPS)
nuidp->nu_cr.cr_ngroups = NGROUPS;
nuidp->nu_cr.cr_ref = 1;
diff --git a/sys/nfsclient/nfsargs.h b/sys/nfsclient/nfsargs.h
index 5c5a823..6423e5a 100644
--- a/sys/nfsclient/nfsargs.h
+++ b/sys/nfsclient/nfsargs.h
@@ -197,7 +197,7 @@ struct nfsd_srvargs {
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
uid_t nsd_uid; /* Effective uid mapped to cred */
u_int32_t nsd_haddr; /* Ip address of client */
- struct ucred nsd_cr; /* Cred. uid maps to */
+ struct xucred nsd_cr; /* Cred. uid maps to */
int nsd_authlen; /* Length of auth string (ret) */
u_char *nsd_authstr; /* Auth string (ret) */
int nsd_verflen; /* and the verfier */
diff --git a/sys/nfsclient/nfsstats.h b/sys/nfsclient/nfsstats.h
index 5c5a823..6423e5a 100644
--- a/sys/nfsclient/nfsstats.h
+++ b/sys/nfsclient/nfsstats.h
@@ -197,7 +197,7 @@ struct nfsd_srvargs {
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
uid_t nsd_uid; /* Effective uid mapped to cred */
u_int32_t nsd_haddr; /* Ip address of client */
- struct ucred nsd_cr; /* Cred. uid maps to */
+ struct xucred nsd_cr; /* Cred. uid maps to */
int nsd_authlen; /* Length of auth string (ret) */
u_char *nsd_authstr; /* Auth string (ret) */
int nsd_verflen; /* and the verfier */
diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h
index 5c5a823..6423e5a 100644
--- a/sys/nfsserver/nfs.h
+++ b/sys/nfsserver/nfs.h
@@ -197,7 +197,7 @@ struct nfsd_srvargs {
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
uid_t nsd_uid; /* Effective uid mapped to cred */
u_int32_t nsd_haddr; /* Ip address of client */
- struct ucred nsd_cr; /* Cred. uid maps to */
+ struct xucred nsd_cr; /* Cred. uid maps to */
int nsd_authlen; /* Length of auth string (ret) */
u_char *nsd_authstr; /* Auth string (ret) */
int nsd_verflen; /* and the verfier */
diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c
index 4eb5c86..2d46568 100644
--- a/sys/nfsserver/nfs_syscalls.c
+++ b/sys/nfsserver/nfs_syscalls.c
@@ -260,7 +260,13 @@ nfssvc(p, uap)
FREE(nuidp->nu_nam, M_SONAME);
}
nuidp->nu_flag = 0;
- nuidp->nu_cr = nsd->nsd_cr;
+ bzero(&nuidp->nu_cr, sizeof(nuidp->nu_cr));
+ nuidp->nu_cr.cr_uid = nsd->nsd_cr.cr_uid;
+ nuidp->nu_cr.cr_ngroups =
+ nsd->nsd_cr.cr_ngroups;
+ bcopy(nsd->nsd_cr.cr_groups,
+ nuidp->nu_cr.cr_groups,
+ sizeof(nuidp->nu_cr.cr_groups));
if (nuidp->nu_cr.cr_ngroups > NGROUPS)
nuidp->nu_cr.cr_ngroups = NGROUPS;
nuidp->nu_cr.cr_ref = 1;
diff --git a/sys/nfsserver/nfsrvstats.h b/sys/nfsserver/nfsrvstats.h
index 5c5a823..6423e5a 100644
--- a/sys/nfsserver/nfsrvstats.h
+++ b/sys/nfsserver/nfsrvstats.h
@@ -197,7 +197,7 @@ struct nfsd_srvargs {
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
uid_t nsd_uid; /* Effective uid mapped to cred */
u_int32_t nsd_haddr; /* Ip address of client */
- struct ucred nsd_cr; /* Cred. uid maps to */
+ struct xucred nsd_cr; /* Cred. uid maps to */
int nsd_authlen; /* Length of auth string (ret) */
u_char *nsd_authstr; /* Auth string (ret) */
int nsd_verflen; /* and the verfier */
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index ea5a71a..345f5a0 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -245,11 +245,11 @@ typedef struct fhandle fhandle_t;
struct export_args {
int ex_flags; /* export related flags */
uid_t ex_root; /* mapping for root uid */
- struct ucred ex_anon; /* mapping for anonymous user */
+ struct xucred ex_anon; /* mapping for anonymous user */
struct sockaddr *ex_addr; /* net address to which exported */
- int ex_addrlen; /* and the net address length */
+ u_char ex_addrlen; /* and the net address length */
struct sockaddr *ex_mask; /* mask of valid bits in saddr */
- int ex_masklen; /* and the smask length */
+ u_char ex_masklen; /* and the smask length */
char *ex_indexfile; /* index file for WebNFS URLs */
};
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 3b17118..161577d 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -46,7 +46,7 @@
#define BSD4_3 1
#define BSD4_4 1
#undef __FreeBSD_version
-#define __FreeBSD_version 500016 /* Master, propagated to newvers */
+#define __FreeBSD_version 500017 /* Master, propagated to newvers */
#ifndef NULL
#define NULL 0
diff --git a/sys/sys/ucred.h b/sys/sys/ucred.h
index 5fb8d6d..63adce8 100644
--- a/sys/sys/ucred.h
+++ b/sys/sys/ucred.h
@@ -57,6 +57,19 @@ struct ucred {
#define NOCRED ((struct ucred *)0) /* no credential available */
#define FSCRED ((struct ucred *)-1) /* filesystem credential */
+/*
+ * This is the external representation of struct ucred, based upon the
+ * size of a 4.2-RELEASE struct ucred. There will probably never be
+ * any need to change the size of this or layout of its used fields.
+ */
+struct xucred {
+ u_short _cr_unused0; /* compatibility with old ucred */
+ uid_t cr_uid; /* effective user id */
+ short cr_ngroups; /* number of groups */
+ gid_t cr_groups[NGROUPS]; /* groups */
+ void *_cr_unused1; /* compatibility with old ucred */
+};
+
#ifdef _KERNEL
struct proc;
OpenPOWER on IntegriCloud