svcrpc: fix failures to handle -1 uid's and gid's
As of f025adf191
"sunrpc: Properly decode
kuids and kgids in RPC_AUTH_UNIX credentials" any rpc containing a -1
(0xffff) uid or gid would fail with a badcred error.
Reported symptoms were xmbc clients failing on upgrade of the NFS
server; examination of the network trace showed them sending -1 as the
gid.
Reported-by: Julian Sikorski <belegdol@gmail.com>
Tested-by: Julian Sikorski <belegdol@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: stable@vger.kernel.org
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
b161c14440
commit
afe3c3fd53
|
@ -810,11 +810,15 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
|
||||||
goto badcred;
|
goto badcred;
|
||||||
argv->iov_base = (void*)((__be32*)argv->iov_base + slen); /* skip machname */
|
argv->iov_base = (void*)((__be32*)argv->iov_base + slen); /* skip machname */
|
||||||
argv->iov_len -= slen*4;
|
argv->iov_len -= slen*4;
|
||||||
|
/*
|
||||||
|
* Note: we skip uid_valid()/gid_valid() checks here for
|
||||||
|
* backwards compatibility with clients that use -1 id's.
|
||||||
|
* Instead, -1 uid or gid is later mapped to the
|
||||||
|
* (export-specific) anonymous id by nfsd_setuser.
|
||||||
|
* Supplementary gid's will be left alone.
|
||||||
|
*/
|
||||||
cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */
|
cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */
|
||||||
cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */
|
cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */
|
||||||
if (!uid_valid(cred->cr_uid) || !gid_valid(cred->cr_gid))
|
|
||||||
goto badcred;
|
|
||||||
slen = svc_getnl(argv); /* gids length */
|
slen = svc_getnl(argv); /* gids length */
|
||||||
if (slen > 16 || (len -= (slen + 2)*4) < 0)
|
if (slen > 16 || (len -= (slen + 2)*4) < 0)
|
||||||
goto badcred;
|
goto badcred;
|
||||||
|
@ -823,8 +827,6 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
|
||||||
return SVC_CLOSE;
|
return SVC_CLOSE;
|
||||||
for (i = 0; i < slen; i++) {
|
for (i = 0; i < slen; i++) {
|
||||||
kgid_t kgid = make_kgid(&init_user_ns, svc_getnl(argv));
|
kgid_t kgid = make_kgid(&init_user_ns, svc_getnl(argv));
|
||||||
if (!gid_valid(kgid))
|
|
||||||
goto badcred;
|
|
||||||
GROUP_AT(cred->cr_group_info, i) = kgid;
|
GROUP_AT(cred->cr_group_info, i) = kgid;
|
||||||
}
|
}
|
||||||
if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
|
if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
|
||||||
|
|
Loading…
Reference in New Issue