summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiels de Vos <ndevos@redhat.com>2015-05-31 22:29:11 +0200
committerNiels de Vos <ndevos@redhat.com>2015-06-03 12:50:56 -0700
commitb8b59fea7822f9ab1e10d7a3f730354fe82a6097 (patch)
treeb6fead790f3ee1232de48e5bbd0bcdc2d4f1a042
parent0209b18fd65f9df5ebd0a8764ebf864d0d392998 (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). 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>
-rw-r--r--xlators/nfs/server/src/auth-cache.c32
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;
}