summaryrefslogtreecommitdiffstats
path: root/xlators/features/marker/utils/src/procdiggy.c
diff options
context:
space:
mode:
authorAmar Tumballi <amarts@redhat.com>2012-05-03 16:39:55 +0530
committerAnand Avati <avati@redhat.com>2012-05-09 00:41:28 -0700
commit17b0814243b4ccd56c0ce570b7f42d5e572e1e71 (patch)
treec0fc4f62e4b518ac2c751a95e660e41444f91ea3 /xlators/features/marker/utils/src/procdiggy.c
parent53a09f49abb291625c96409627cba348f0c35e55 (diff)
geo-replication: coverity resource leak fixes
Change-Id: I5739e9c9ae6fe78a6defb640d630e5f918ac1295 Signed-off-by: Amar Tumballi <amarts@redhat.com> BUG: 789278 Reviewed-on: http://review.gluster.com/3266 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/features/marker/utils/src/procdiggy.c')
-rw-r--r--xlators/features/marker/utils/src/procdiggy.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/xlators/features/marker/utils/src/procdiggy.c b/xlators/features/marker/utils/src/procdiggy.c
index fc0f97999d6..e5f9af7b614 100644
--- a/xlators/features/marker/utils/src/procdiggy.c
+++ b/xlators/features/marker/utils/src/procdiggy.c
@@ -38,6 +38,7 @@ pidinfo (pid_t pid, char **name)
char buf[NAME_MAX * 2] = {0,};
FILE *f = NULL;
char *p = NULL;
+ char *free_p = NULL;
int ret = 0;
ret = gf_asprintf (&p, PROC"/%d/status", pid);
@@ -45,8 +46,11 @@ pidinfo (pid_t pid, char **name)
goto oom;
f = fopen (p, "r");
- if (!f)
+ if (!f) {
+ GF_FREE (p);
return -1;
+ }
+ free_p = p;
if (name)
*name = NULL;
@@ -81,17 +85,21 @@ pidinfo (pid_t pid, char **name)
pid = -1;
out:
+ if (free_p)
+ GF_FREE (free_p);
fclose (f);
return pid;
oom:
+ if (free_p)
+ GF_FREE (free_p);
fclose (f);
fprintf (stderr, "out of memory\n");
return -2;
}
int
-prociter (int (*proch) (pid_t pid, pid_t ppid, char *name, void *data),
+prociter (int (*proch) (pid_t pid, pid_t ppid, char *tmpname, void *data),
void *data)
{
char *name = NULL;
@@ -102,23 +110,38 @@ prociter (int (*proch) (pid_t pid, pid_t ppid, char *name, void *data),
int ret = 0;
d = opendir (PROC);
+ if (!d) {
+ ret = -1;
+ goto out;
+ }
while (errno = 0, de = readdir (d)) {
if (gf_string2int (de->d_name, &pid) != -1 && pid >= 0) {
ppid = pidinfo (pid, &name);
switch (ppid) {
case -1: continue;
- case -2: return -1;
+ case -2: closedir (d); return -1;
}
ret = proch (pid, ppid, name, data);
- if (ret)
- return ret;
+ if (ret) {
+ goto out;
+ }
+ GF_FREE (name);
+ name = NULL;
}
}
if (errno) {
fprintf (stderr, "failed to traverse "PROC" (%s)\n",
strerror (errno));
- return -1;
+ goto out;
}
- return 0;
+ ret = 0;
+out:
+ if (d)
+ closedir (d);
+
+ if (name)
+ GF_FREE (name);
+
+ return ret;
}