commit:     8dbdabcc5e0df8ac36722a4ba7bfe30664cc9919
Author:     William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
AuthorDate: Fri Feb 16 20:04:40 2018 +0000
Commit:     William Hubbs <williamh <AT> gentoo <DOT> org>
CommitDate: Fri Feb 16 20:04:40 2018 +0000
URL:        https://gitweb.gentoo.org/proj/openrc.git/commit/?id=8dbdabcc

start-stop-daemon: clean up string handling

 src/rc/start-stop-daemon.c | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/rc/start-stop-daemon.c b/src/rc/start-stop-daemon.c
index 54b89b2a..88b1e091 100644
--- a/src/rc/start-stop-daemon.c
+++ b/src/rc/start-stop-daemon.c
@@ -254,6 +254,7 @@ int main(int argc, char **argv)
 #endif
 
        int opt;
+       size_t size = 0;
        bool start = false;
        bool stop = false;
        bool oknodo = false;
@@ -287,10 +288,10 @@ int main(int argc, char **argv)
        char *tmp, *newpath, *np;
        char *p;
        char *token;
-       char exec_file[PATH_MAX];
+       char *exec_file = NULL;
        struct passwd *pw;
        struct group *gr;
-       char line[130];
+       char *line = NULL;
        FILE *fp;
        size_t len;
        mode_t numask = 022;
@@ -577,26 +578,22 @@ int main(int argc, char **argv)
                if (*exec == '/' || *exec == '.') {
                        /* Full or relative path */
                        if (ch_root)
-                               snprintf(exec_file, sizeof(exec_file),
-                                   "%s/%s", ch_root, exec);
+                               xasprintf(&exec_file, "%s/%s", ch_root, exec);
                        else
-                               snprintf(exec_file, sizeof(exec_file),
-                                   "%s", exec);
+                               xasprintf(&exec_file, "%s", exec);
                } else {
                        /* Something in $PATH */
                        p = tmp = xstrdup(getenv("PATH"));
-                       *exec_file = '\0';
+                       exec_file = NULL;
                        while ((token = strsep(&p, ":"))) {
                                if (ch_root)
-                                       snprintf(exec_file, sizeof(exec_file),
-                                           "%s/%s/%s",
-                                           ch_root, token, exec);
+                                       xasprintf(&exec_file, "%s/%s/%s", 
ch_root, token, exec);
                                else
-                                       snprintf(exec_file, sizeof(exec_file),
-                                           "%s/%s", token, exec);
-                               if (exists(exec_file))
+                                       xasprintf(&exec_file, "%s/%s", token, 
exec);
+                               if (exec_file && exists(exec_file))
                                        break;
-                               *exec_file = '\0';
+                               free(exec_file);
+                               exec_file = NULL;
                        }
                        free(tmp);
                }
@@ -604,6 +601,7 @@ int main(int argc, char **argv)
        if (start && !exists(exec_file)) {
                eerror("%s: %s does not exist", applet,
                    *exec_file ? exec_file : exec);
+               free(exec_file);
                exit(EXIT_FAILURE);
 
        }
@@ -617,7 +615,9 @@ int main(int argc, char **argv)
        if (interpreted && !pidfile) {
                fp = fopen(exec_file, "r");
                if (fp) {
-                       p = fgets(line, sizeof(line), fp);
+                       line = NULL;
+                       getline(&line, &size, fp);
+                       p = line;
                        fclose(fp);
                        if (p != NULL && line[0] == '#' && line[1] == '!') {
                                p = line + 2;
@@ -629,7 +629,8 @@ int main(int argc, char **argv)
                                if (p[len] == '\n')
                                        p[len] = '\0';
                                token = strsep(&p, " ");
-                               strncpy(exec_file, token, sizeof(exec_file));
+                               free(exec_file);
+                               xasprintf(&exec_file, "%s", token);
                                opt = 0;
                                for (nav = argv; *nav; nav++)
                                        opt++;

Reply via email to