Gentoo Archives: gentoo-commits

From: William Hubbs <williamh@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/openrc:master commit in: src/rc/
Date: Thu, 22 Feb 2018 00:17:33
Message-Id: 1519258496.e275da84de1589253da5ff6a7c272cf1c82f8567.williamh@OpenRC
1 commit: e275da84de1589253da5ff6a7c272cf1c82f8567
2 Author: William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
3 AuthorDate: Thu Feb 22 00:14:56 2018 +0000
4 Commit: William Hubbs <williamh <AT> gentoo <DOT> org>
5 CommitDate: Thu Feb 22 00:14:56 2018 +0000
6 URL: https://gitweb.gentoo.org/proj/openrc.git/commit/?id=e275da84
7
8 supervise-daemon: remove references to PATH_MAX
9
10 src/rc/supervise-daemon.c | 102 +++++++++++++++++++++++++---------------------
11 1 file changed, 56 insertions(+), 46 deletions(-)
12
13 diff --git a/src/rc/supervise-daemon.c b/src/rc/supervise-daemon.c
14 index 06d0bdb3..a858cf46 100644
15 --- a/src/rc/supervise-daemon.c
16 +++ b/src/rc/supervise-daemon.c
17 @@ -224,6 +224,22 @@ static char * expand_home(const char *home, const char *path)
18 return nh;
19 }
20
21 +static char *make_cmdline(char **argv)
22 +{
23 + char **c;
24 + char *cmdline = NULL;
25 + size_t len = 0;
26 +
27 + for (c = argv; c && *c; c++)
28 + len += (strlen(*c) + 1);
29 + cmdline = xmalloc(len);
30 + for (c = argv; c && *c; c++) {
31 + strcat(cmdline, *c);
32 + strcat(cmdline, " ");
33 + }
34 + return cmdline;
35 +}
36 +
37 static void child_process(char *exec, char **argv)
38 {
39 RC_STRINGLIST *env_list;
40 @@ -234,8 +250,7 @@ static void child_process(char *exec, char **argv)
41 size_t len;
42 char *newpath;
43 char *np;
44 - char **c;
45 - char cmdline[PATH_MAX];
46 + char *cmdline = NULL;
47 time_t start_time;
48 char start_count_string[20];
49 char start_time_string[20];
50 @@ -395,15 +410,9 @@ static void child_process(char *exec, char **argv)
51
52 for (i = getdtablesize() - 1; i >= 3; --i)
53 fcntl(i, F_SETFD, FD_CLOEXEC);
54 -
55 - *cmdline = '\0';
56 - c = argv;
57 - while (c && *c) {
58 - strcat(cmdline, *c);
59 - strcat(cmdline, " ");
60 - c++;
61 - }
62 + cmdline = make_cmdline(argv);
63 syslog(LOG_INFO, "Child command line: %s", cmdline);
64 + free(cmdline);
65 execvp(exec, argv);
66
67 #ifdef HAVE_PAM
68 @@ -551,8 +560,8 @@ int main(int argc, char **argv)
69 char *token;
70 int i;
71 int n;
72 - char exec_file[PATH_MAX];
73 - char name[PATH_MAX];
74 + char *exec_file = NULL;
75 + char *varbuf = NULL;
76 struct timespec ts;
77 struct passwd *pw;
78 struct group *gr;
79 @@ -561,7 +570,7 @@ int main(int argc, char **argv)
80 int child_argc = 0;
81 char **child_argv = NULL;
82 char *str = NULL;
83 - char cmdline[PATH_MAX];
84 + char *cmdline = NULL;
85
86 applet = basename_c(argv[0]);
87 atexit(cleanup);
88 @@ -593,13 +602,7 @@ int main(int argc, char **argv)
89 }
90 }
91
92 - *cmdline = '\0';
93 - c = argv;
94 - while (c && *c) {
95 - strcat(cmdline, *c);
96 - strcat(cmdline, " ");
97 - c++;
98 - }
99 + cmdline = make_cmdline(argv);
100 if (svcname) {
101 argc--;
102 argv++;
103 @@ -761,9 +764,11 @@ int main(int argc, char **argv)
104 child_argv = xmalloc((child_argc + 1) * sizeof(char *));
105 memset(child_argv, 0, (child_argc + 1) * sizeof(char *));
106 for (x = 0; x < child_argc; x++) {
107 - sprintf(name, "argv_%d", x);
108 - str = rc_service_value_get(svcname, name);
109 + xasprintf(&varbuf, "argv_%d", x);
110 + str = rc_service_value_get(svcname, varbuf);
111 child_argv[x] = str;
112 + free(varbuf);
113 + varbuf = NULL;
114 }
115 free(str);
116 str = rc_service_value_get(svcname, "child_pid");
117 @@ -792,32 +797,31 @@ int main(int argc, char **argv)
118 if (*exec == '/' || *exec == '.') {
119 /* Full or relative path */
120 if (ch_root)
121 - snprintf(exec_file, sizeof(exec_file),
122 - "%s/%s", ch_root, exec);
123 + xasprintf(&exec_file, "%s/%s", ch_root, exec);
124 else
125 - snprintf(exec_file, sizeof(exec_file),
126 - "%s", exec);
127 + xasprintf(&exec_file, "%s", exec);
128 } else {
129 /* Something in $PATH */
130 p = tmp = xstrdup(getenv("PATH"));
131 - *exec_file = '\0';
132 + exec_file = NULL;
133 while ((token = strsep(&p, ":"))) {
134 if (ch_root)
135 - snprintf(exec_file, sizeof(exec_file),
136 - "%s/%s/%s",
137 - ch_root, token, exec);
138 + xasprintf(&exec_file, "%s/%s/%s", ch_root, token, exec);
139 else
140 - snprintf(exec_file, sizeof(exec_file),
141 - "%s/%s", token, exec);
142 - if (exists(exec_file))
143 + xasprintf(&exec_file, "%s/%s", token, exec);
144 + if (exec_file && exists(exec_file))
145 break;
146 - *exec_file = '\0';
147 + free(exec_file);
148 + exec_file = NULL;
149 }
150 free(tmp);
151 }
152 - if ( !exists(exec_file))
153 - eerrorx("%s: %s does not exist", applet,
154 + if (!exists(exec_file)) {
155 + eerror("%s: %s does not exist", applet,
156 *exec_file ? exec_file : exec);
157 + free(exec_file);
158 + exit(EXIT_FAILURE);
159 + }
160 } else
161 eerrorx("%s: nothing to start", applet);
162
163 @@ -840,6 +844,8 @@ int main(int argc, char **argv)
164
165 einfov("Detaching to start `%s'", exec);
166 syslog(LOG_INFO, "Supervisor command line: %s", cmdline);
167 + free(cmdline);
168 + cmdline = NULL;
169
170 /* Remove existing pidfile */
171 if (pidfile)
172 @@ -852,12 +858,13 @@ int main(int argc, char **argv)
173 fclose(fp);
174
175 rc_service_value_set(svcname, "pidfile", pidfile);
176 - sprintf(name, "%i", respawn_delay);
177 - rc_service_value_set(svcname, "respawn_delay", name);
178 - sprintf(name, "%i", respawn_max);
179 - rc_service_value_set(svcname, "respawn_max", name);
180 - sprintf(name, "%i", respawn_period);
181 - rc_service_value_set(svcname, "respawn_period", name);
182 + varbuf = NULL;
183 + xasprintf(&varbuf, "%i", respawn_delay);
184 + rc_service_value_set(svcname, "respawn_delay", varbuf);
185 + xasprintf(&varbuf, "%i", respawn_max);
186 + rc_service_value_set(svcname, "respawn_max", varbuf);
187 + xasprintf(&varbuf, "%i", respawn_period);
188 + rc_service_value_set(svcname, "respawn_period", varbuf);
189 child_pid = fork();
190 if (child_pid == -1)
191 eerrorx("%s: fork: %s", applet, strerror(errno));
192 @@ -875,13 +882,16 @@ int main(int argc, char **argv)
193 c = argv;
194 x = 0;
195 while (c && *c) {
196 - snprintf(name, sizeof(name), "argv_%-d",x);
197 - rc_service_value_set(svcname, name, *c);
198 + varbuf = NULL;
199 + xasprintf(&varbuf, "argv_%-d",x);
200 + rc_service_value_set(svcname, varbuf, *c);
201 + free(varbuf);
202 + varbuf = NULL;
203 x++;
204 c++;
205 }
206 - sprintf(name, "%d", x);
207 - rc_service_value_set(svcname, "argc", name);
208 + xasprintf(&varbuf, "%d", x);
209 + rc_service_value_set(svcname, "argc", varbuf);
210 rc_service_value_set(svcname, "exec", exec);
211 supervisor(exec, argv);
212 } else