diff options
author | Niels de Vos <ndevos@redhat.com> | 2015-06-03 21:53:37 +0200 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2015-06-09 10:09:22 -0700 |
commit | cccd1e3cce7873e873c7266af703f4f77ff4c679 (patch) | |
tree | c8b675415616d8dd5de7e9227399141cfb77516b /xlators | |
parent | 98a01fe47cad0f6e71112326999fcfd6df8e43de (diff) |
nfs: allocate and return the hashkey for the auth_cache_entry
The allocation of the hashkey was never returned to the calling
function.
Allocating it with alloca() puts it on the stack, returning from the
function makes the pointer invalid. Functions that are annotated with
"inline" and call alloca(), will not always be inlined. Returning a
pointer allocated with alloca() is in those cases not correct. One such
confirmation was provided by GCC developer Alexandre Oliva:
- http://gcc.gnu.org/ml/gcc-help/2004-04/msg00158.html
It is more correct to call GF_MALLOC() and GF_FREE() for the hashkey. If
this would result in preformance hit, we can always think of using
alloca() again and turn make_hashkey() into a macro (yuck).
Cherry picked from commit b8b59fea7822f9ab1e10d7a3f730354fe82a6097:
> Change-Id: Ia86a1f79d33240af4713bfb92f702b0ee6e87eb7
> BUG: 1226714
> Signed-off-by: Niels de Vos <ndevos@redhat.com>
> Reviewed-on: http://review.gluster.org/11019
> Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
> Reviewed-by: jiffin tony Thottan <jthottan@redhat.com>
> Reviewed-by: soumya k <skoduri@redhat.com>
> Tested-by: Gluster Build System <jenkins@build.gluster.com>
Change-Id: Ia86a1f79d33240af4713bfb92f702b0ee6e87eb7
BUG: 1227916
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: http://review.gluster.org/11075
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: jiffin tony Thottan <jthottan@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/nfs/server/src/auth-cache.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/xlators/nfs/server/src/auth-cache.c b/xlators/nfs/server/src/auth-cache.c index 848eed5e8fb..b0cb7bf378d 100644 --- a/xlators/nfs/server/src/auth-cache.c +++ b/xlators/nfs/server/src/auth-cache.c @@ -27,12 +27,12 @@ struct auth_cache_entry { struct export_item *item; }; -/* Given a filehandle and an ip, creates a colon delimited hashkey that is - * allocated on the stack. +/* Given a filehandle and an ip, creates a colon delimited hashkey. */ -static inline void -make_hashkey(char *hashkey, struct nfs3_fh *fh, const char *host) +static char* +make_hashkey(struct nfs3_fh *fh, const char *host) { + char *hashkey = NULL; char exportid[256] = {0, }; char gfid[256] = {0, }; char mountid[256] = {0, }; @@ -41,11 +41,17 @@ make_hashkey(char *hashkey, struct nfs3_fh *fh, const char *host) gf_uuid_unparse (fh->exportid, exportid); gf_uuid_unparse (fh->gfid, gfid); gf_uuid_unparse (fh->mountid, mountid); + nbytes = strlen (exportid) + strlen (gfid) + strlen (host) + strlen (mountid) + 5; - hashkey = alloca (nbytes); + hashkey = GF_MALLOC (nbytes, gf_common_mt_char); + if (!hashkey) + return NULL; + snprintf (hashkey, nbytes, "%s:%s:%s:%s", exportid, gfid, mountid, host); + + return hashkey; } /** @@ -127,7 +133,11 @@ auth_cache_lookup (struct auth_cache *cache, struct nfs3_fh *fh, GF_VALIDATE_OR_GOTO (GF_NFS, timestamp, out); GF_VALIDATE_OR_GOTO (GF_NFS, can_write, out); - make_hashkey (hashkey, fh, host_addr); + hashkey = make_hashkey (fh, host_addr); + if (!hashkey) { + ret = -ENOMEM; + goto out; + } entry_data = dict_get (cache->cache_dict, hashkey); if (!entry_data) { @@ -155,6 +165,8 @@ auth_cache_lookup (struct auth_cache *cache, struct nfs3_fh *fh, ret = ENTRY_FOUND; out: + GF_FREE (hashkey); + return ret; } @@ -277,7 +289,11 @@ cache_nfs_fh (struct auth_cache *cache, struct nfs3_fh *fh, goto out; } - make_hashkey (hashkey, fh, host_addr); + hashkey = make_hashkey (fh, host_addr); + if (!hashkey) { + ret = -ENOMEM; + goto out; + } entry = auth_cache_entry_init (); if (!entry) { @@ -305,5 +321,7 @@ cache_nfs_fh (struct auth_cache *cache, struct nfs3_fh *fh, gf_msg_trace (GF_NFS, 0, "Caching file-handle (%s)", host_addr); ret = 0; out: + GF_FREE (hashkey); + return ret; } |