diff options
Diffstat (limited to 'rpc/rpc-lib/src')
| -rw-r--r-- | rpc/rpc-lib/src/auth-glusterfs.c | 32 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/auth-unix.c | 1 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc-auth.c | 3 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 2 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.h | 4 | 
5 files changed, 41 insertions, 1 deletions
diff --git a/rpc/rpc-lib/src/auth-glusterfs.c b/rpc/rpc-lib/src/auth-glusterfs.c index 9c6f8385b2c..db488434c98 100644 --- a/rpc/rpc-lib/src/auth-glusterfs.c +++ b/rpc/rpc-lib/src/auth-glusterfs.c @@ -96,6 +96,22 @@ int auth_glusterfs_authenticate (rpcsvc_request_t *req, void *priv)                  goto err;          } +	if (req->auxgidcount > SMALL_GROUP_COUNT) { +		req->auxgidlarge = GF_CALLOC(req->auxgidcount, +					     sizeof(req->auxgids[0]), +					     gf_common_mt_auxgids); +		req->auxgids = req->auxgidlarge; +	} else { +		req->auxgids = req->auxgidsmall; +	} + +	if (!req->auxgids) { +		gf_log ("auth-glusterfs", GF_LOG_WARNING, +			"cannot allocate gid list"); +		ret = RPCSVC_AUTH_REJECT; +		goto err; +	} +          for (gidcount = 0; gidcount < au.ngrps; ++gidcount)                  req->auxgids[gidcount] = au.groups[gidcount]; @@ -203,6 +219,22 @@ int auth_glusterfs_v2_authenticate (rpcsvc_request_t *req, void *priv)                  goto err;          } +	if (req->auxgidcount > SMALL_GROUP_COUNT) { +		req->auxgidlarge = GF_CALLOC(req->auxgidcount, +					     sizeof(req->auxgids[0]), +					     gf_common_mt_auxgids); +		req->auxgids = req->auxgidlarge; +	} else { +		req->auxgids = req->auxgidsmall; +	} + +	if (!req->auxgids) { +		gf_log ("auth-glusterfs-v2", GF_LOG_WARNING, +			"cannot allocate gid list"); +		ret = RPCSVC_AUTH_REJECT; +		goto err; +	} +          for (i = 0; i < req->auxgidcount; ++i)                  req->auxgids[i] = au.groups.groups_val[i]; diff --git a/rpc/rpc-lib/src/auth-unix.c b/rpc/rpc-lib/src/auth-unix.c index 6251d60a896..fa5f0576e31 100644 --- a/rpc/rpc-lib/src/auth-unix.c +++ b/rpc/rpc-lib/src/auth-unix.c @@ -42,6 +42,7 @@ int auth_unix_authenticate (rpcsvc_request_t *req, void *priv)          if (!req)                  return ret; +	req->auxgids = req->auxgidsmall;          ret = xdr_to_auth_unix_cred (req->cred.authdata, req->cred.datalen,                                       &aup, machname, req->auxgids);          if (ret == -1) { diff --git a/rpc/rpc-lib/src/rpcsvc-auth.c b/rpc/rpc-lib/src/rpcsvc-auth.c index 1082794568c..7ee96d85bed 100644 --- a/rpc/rpc-lib/src/rpcsvc-auth.c +++ b/rpc/rpc-lib/src/rpcsvc-auth.c @@ -327,6 +327,9 @@ rpcsvc_auth_request_init (rpcsvc_request_t *req)          if (!auth->authops->request_init)                  ret = auth->authops->request_init (req, auth->authprivate); +	req->auxgids = req->auxgidsmall; /* reset to auxgidlarge during +					    unsersialize if necessary */ +	req->auxgidlarge = NULL;  err:          return ret;  } diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index d6f5e754d88..493cc8fae6c 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -282,6 +282,8 @@ rpcsvc_request_destroy (rpcsvc_request_t *req)          rpc_transport_unref (req->trans); +	GF_FREE (req->auxgidlarge); +          mem_put (req);  out: diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h index 67ff74be6bc..a08ee4b57d4 100644 --- a/rpc/rpc-lib/src/rpcsvc.h +++ b/rpc/rpc-lib/src/rpcsvc.h @@ -181,7 +181,9 @@ struct rpcsvc_request {          /* Might want to move this to AUTH_UNIX specific state since this array           * is not available for every authentication scheme.           */ -        gid_t                   auxgids[GF_MAX_AUX_GROUPS]; +        gid_t                   *auxgids; +        gid_t                   auxgidsmall[SMALL_GROUP_COUNT]; +        gid_t                   *auxgidlarge;          int                     auxgidcount;  | 
