This patch fix some problems as below.

1. memory leak in error cases
2. when error occured, exit is tough, just return -1 is better
3. incorrect error message

Signed-off-by: Ruoyu <[email protected]>
---
 sheep/cluster/shepherd.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/sheep/cluster/shepherd.c b/sheep/cluster/shepherd.c
index 9453ff8..45a85c1 100644
--- a/sheep/cluster/shepherd.c
+++ b/sheep/cluster/shepherd.c
@@ -467,25 +467,25 @@ static void shepherd_comm_handler(int fd, int events, 
void *data)
 
 static int shepherd_init(const char *option)
 {
-       int ret, port;
+       int ret = -1, port;
        char *copied, *s_addr, *s_port, *saveptr;
 
        if (!option) {
                sd_err("shepherd cluster driver requires at least IP"
                       " address of shepherd as an option");
-               exit(1);
+               return ret;
        }
 
        copied = strdup(option);
        if (!copied) {
                sd_err("strdup() failed: %m");
-               exit(1);
+               return ret;
        }
 
        s_addr = strtok_r(copied, ":", &saveptr);
        if (!s_addr) {
-               sd_err("strdup() failed: %m");
-               exit(1);
+               sd_err("strtok_r() failed: %m");
+               goto out;
        }
 
        s_port = strtok_r(NULL, ":", &saveptr);
@@ -495,7 +495,7 @@ static int shepherd_init(const char *option)
 
                if (*p != '\0') {
                        sd_err("invalid option for host and port: %s", option);
-                       exit(1);
+                       goto out;
                }
        } else
                port = SHEPHERD_PORT;
@@ -504,19 +504,20 @@ static int shepherd_init(const char *option)
        if (sph_comm_fd == -1) {
                sd_err("cannot connect to shepherd,"
                       " is shepherd running? errno: %m");
-               return -1;
+               goto out;
        }
 
        sph_event_fd = eventfd(0, EFD_NONBLOCK);
        ret = register_event(sph_event_fd, sph_event_handler, NULL);
        if (ret) {
                sd_err("register_event() failed: %m");
-               exit(1);
+               goto out;
        }
 
+       ret = 0;
+out:
        free(copied);
-
-       return 0;
+       return ret;
 }
 
 static int shepherd_join(const struct sd_node *myself,
-- 
1.8.3.2


-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to