summaryrefslogtreecommitdiffstats
path: root/xlators/performance/stat-prefetch/src/stat-prefetch.c
diff options
context:
space:
mode:
authorAnand Avati <avati@gluster.com>2011-05-20 16:56:28 +0000
committerAnand Avati <avati@gluster.com>2011-05-30 04:48:48 -0700
commitfa19eabd89c0efc52830ad5f6ac63285175acce7 (patch)
tree3290d3033bf03bbf98b9295324c172b9690e5cae /xlators/performance/stat-prefetch/src/stat-prefetch.c
parent80b84f4b852c2794c46af4de1e8ab48673163dc3 (diff)
stat-prefetch: fix dirname(3) usage
glibc dirname() modify the string it is given and returns it. glusterfs takes this behavior for granted, and assume that if it gives a malloc'ed string to dirname(), then it can free()) the return value. Here is what SUSv2 says: http://opengroup.org/onlinepubs/007908799/xsh/dirname.html "The dirname() function may modify the string pointed to by path, and may return a pointer to static storage" At least NetBSD returns a static storage. glusterfs will return it to a calling function that has the responsability to free it, causing a SIGSEGV. Thanks to: Emmanuel Dreyfus <manu@netbsd.org> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2923 (NetBSD port) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2923
Diffstat (limited to 'xlators/performance/stat-prefetch/src/stat-prefetch.c')
-rw-r--r--xlators/performance/stat-prefetch/src/stat-prefetch.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/xlators/performance/stat-prefetch/src/stat-prefetch.c b/xlators/performance/stat-prefetch/src/stat-prefetch.c
index b99c91bce..be83dcb29 100644
--- a/xlators/performance/stat-prefetch/src/stat-prefetch.c
+++ b/xlators/performance/stat-prefetch/src/stat-prefetch.c
@@ -950,16 +950,22 @@ sp_get_ancestors (char *path, char **parent, char **grand_parent)
switch (i)
{
case 0:
- *parent = path;
+ *parent = gf_strdup (path);
+ if (*parent == NULL)
+ goto out;
break;
case 1:
- *grand_parent = path;
+ *grand_parent = gf_strdup (path);
+ if (*grand_parent == NULL)
+ goto out;
break;
}
}
ret = 0;
out:
+ if (cpy != NULL)
+ GF_FREE(cpy);
return ret;
}