diff options
Diffstat (limited to 'xlators/features')
-rw-r--r-- | xlators/features/marker/utils/src/gsyncd.c | 41 | ||||
-rw-r--r-- | xlators/features/marker/utils/src/procdiggy.c | 37 |
2 files changed, 64 insertions, 14 deletions
diff --git a/xlators/features/marker/utils/src/gsyncd.c b/xlators/features/marker/utils/src/gsyncd.c index d554e562b..24de4096f 100644 --- a/xlators/features/marker/utils/src/gsyncd.c +++ b/xlators/features/marker/utils/src/gsyncd.c @@ -166,21 +166,28 @@ find_gsyncd (pid_t pid, pid_t ppid, char *name, void *data) pid_t *pida = (pid_t *)data; if (ppid != pida[0]) - return 0; + goto out; ret = gf_asprintf (&p, PROC"/%d/cmdline", pid); if (ret == -1) { fprintf (stderr, "out of memory\n"); - return -1; + goto out; } + ret = 0; + fd = open (p, O_RDONLY); if (fd == -1) - return 0; + goto out; + ret = read (fd, buf, sizeof (buf)); close (fd); - if (ret == -1) - return 0; + + if (ret == -1) { + ret = 0; + goto out; + } + for (zeros = 0, p = buf; zeros < 2 && p < buf + ret; p++) zeros += !*p; @@ -201,12 +208,18 @@ find_gsyncd (pid_t pid, pid_t ppid, char *name, void *data) if (ret == 1) { if (pida[1] != -1) { fprintf (stderr, GSYNCD_PY" sibling is not unique"); - return -1; + ret = -1; + goto out; } pida[1] = pid; } - return 0; + ret = 0; +out: + if (p) + GF_FREE (p); + + return ret; } static int @@ -242,6 +255,8 @@ invoke_rsync (int argc, char **argv) } if (strcmp (name, "sshd") == 0) break; + GF_FREE (name); + name = NULL; } /* look up "ssh-sibling" gsyncd */ pida[0] = pid; @@ -269,10 +284,22 @@ invoke_rsync (int argc, char **argv) execvp (RSYNC, argv); + if (p) + GF_FREE (p); + + if (name) + GF_FREE (name); + fprintf (stderr, "exec of "RSYNC" failed\n"); return 127; error: + if (p) + GF_FREE (p); + + if (name) + GF_FREE (name); + fprintf (stderr, "disallowed "RSYNC" invocation\n"); return 1; } diff --git a/xlators/features/marker/utils/src/procdiggy.c b/xlators/features/marker/utils/src/procdiggy.c index fc0f97999..e5f9af7b6 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; } |