Skip to content

Commit d8104ec

Browse files
authored
Merge pull request #38 from jfsmig/M-fixes-20190826
Various fixes
2 parents 6a088e1 + 3b25644 commit d8104ec

File tree

3 files changed

+96
-83
lines changed

3 files changed

+96
-83
lines changed

main/children.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,14 @@ _child_exec(struct child_s *sd, int argc, char ** args)
357357
/* If the target command is just a filename, then try to find
358358
* it in the PATH that could have been set for this command */
359359
env = _child_build_env(sd);
360-
supervisor_children_cleanall();
360+
361+
/* JFS: No need to free the allocated memory of gridinit, execve will do. */
362+
/* supervisor_children_cleanall(); */
363+
364+
/* JFS: the internal sockets of libdill do not carry the O_CLOEXEC flag.
365+
* We want to avoid any FD leak to the children. */
366+
for (int i=3; i<8; i++)
367+
close(i);
361368

362369
if (g_path_is_absolute(cmd))
363370
real_cmd = g_strdup(cmd);
@@ -380,7 +387,7 @@ _child_start(struct child_s *sd, void *udata, supervisor_cb_f cb)
380387
typeof(errno) errsav;
381388
gint argc;
382389
gchar **args;
383-
struct my_rlimits_s saved_limits;
390+
struct my_rlimits_s saved_limits = {};
384391

385392
if (!sd || !sd->command) {
386393
errno = EINVAL;
@@ -392,8 +399,6 @@ _child_start(struct child_s *sd, void *udata, supervisor_cb_f cb)
392399
return -1;
393400
}
394401

395-
bzero(&saved_limits, sizeof(saved_limits));
396-
397402
sd->last_start_attempt = _monotonic_seconds();
398403
sd->last_start = time(0);
399404

@@ -782,7 +787,7 @@ supervisor_children_register(const gchar *key, const gchar *cmd)
782787
return FALSE;
783788
}
784789

785-
g_strlcpy(sd->key, key, sizeof(sd->key)-1);
790+
g_strlcpy(sd->key, key, sizeof(sd->key));
786791
sd->delay_before_KILL = supervisor_default_delay_KILL;
787792
sd->flags = MASK_STARTED|MASK_RESPAWN|MASK_DELAYED;
788793
sd->working_directory = g_get_current_dir();
@@ -1127,9 +1132,11 @@ supervisor_children_set_group(const gchar *key, const gchar *group)
11271132
return -1;
11281133
}
11291134

1130-
bzero(sd->group, sizeof(sd->group));
1131-
if (group)
1132-
g_strlcpy(sd->group, group, sizeof(sd->group)-1);
1135+
if (group) {
1136+
g_strlcpy(sd->group, group, sizeof(sd->group));
1137+
} else {
1138+
memset(sd->group, 0, sizeof(sd->group));
1139+
}
11331140
errno = 0;
11341141
return 0;
11351142
}

main/gridinit.c

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,8 @@ _client_run(int ch, int ldh_client)
512512
static dill_coroutine void
513513
_server_run(int ch, const char *path)
514514
{
515-
int workers = dill_bundle();
515+
struct dill_bundle_storage bundle_storage = {};
516+
int workers = dill_bundle_mem(&bundle_storage);
516517
g_assert(workers >= 0);
517518

518519
int ldh_server = dill_ipc_listen(path, 1024);
@@ -525,7 +526,7 @@ _server_run(int ch, const char *path)
525526
DEBUG("Initiated a server socket on [%s] h=%d", sock_path, ldh_server);
526527

527528
while (flag_running) {
528-
int ldh_client = dill_ipc_accept(ldh_server, dill_now() + 30000);
529+
int ldh_client = dill_ipc_accept(ldh_server, dill_now() + 1000);
529530
if (ldh_client >= 0) {
530531
TRACE("Client accepted h=%d", ldh_client);
531532
dill_bundle_go(workers, _client_run(ch, ldh_client));
@@ -538,8 +539,10 @@ _server_run(int ch, const char *path)
538539
int rc = dill_hclose(ldh_server);
539540
g_assert(rc == 0);
540541

541-
dill_bundle_wait(workers, dill_now() + 30000);
542+
dill_bundle_wait(workers, -1);
542543
dill_hclose(workers);
544+
545+
unlink(path);
543546
}
544547

545548
static void
@@ -759,9 +762,7 @@ _group_is_accepted(gchar *str_key, gchar *str_group)
759762
static gboolean
760763
_service_exists(const gchar *key)
761764
{
762-
struct child_info_s ci;
763-
764-
bzero(&ci, sizeof(ci));
765+
struct child_info_s ci = {};
765766
return 0 == supervisor_children_get_info(key, &ci);
766767
}
767768

@@ -967,39 +968,33 @@ _cfg_section_default(GKeyFile *kf, const gchar *section, GError **err)
967968
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_PATH_WORKINGDIR)) {
968969
if (!g_file_test(*p_key, G_FILE_TEST_IS_DIR|G_FILE_TEST_IS_EXECUTABLE))
969970
WARN("Default working directory does not exist yet [%s]", *p_key);
970-
bzero(default_working_directory, sizeof(default_working_directory));
971-
g_strlcpy(default_working_directory, str, sizeof(default_working_directory)-1);
971+
g_strlcpy(default_working_directory, str, sizeof(default_working_directory));
972972
}
973973
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_PATH_PIDFILE)) {
974-
bzero(pidfile_path, sizeof(pidfile_path));
975-
g_strlcpy(pidfile_path, str, sizeof(pidfile_path)-1);
974+
g_strlcpy(pidfile_path, str, sizeof(pidfile_path));
976975
}
977976
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_LISTEN)) {
978-
if (str[0] == '/')
977+
if (str[0] == '/') {
979978
g_strlcpy(sock_path, str, sizeof(sock_path));
980-
else
979+
} else {
981980
g_printerr("section=%s, key=listen : not a UNIX path, ignored! [%s]\n",
982981
section, str);
982+
}
983983
}
984984
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_USER)) {
985-
bzero(buf_user, sizeof(buf_user));
986-
g_strlcpy(buf_user, str, sizeof(buf_user)-1);
985+
g_strlcpy(buf_user, str, sizeof(buf_user));
987986
}
988987
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_GROUP)) {
989-
bzero(buf_group, sizeof(buf_group));
990-
g_strlcpy(buf_group, str, sizeof(buf_group)-1);
988+
g_strlcpy(buf_group, str, sizeof(buf_group));
991989
}
992990
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_UID)) {
993-
bzero(buf_uid, sizeof(buf_uid));
994-
g_strlcpy(buf_uid, str, sizeof(buf_uid)-1);
991+
g_strlcpy(buf_uid, str, sizeof(buf_uid));
995992
}
996993
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_GID)) {
997-
bzero(buf_gid, sizeof(buf_gid));
998-
g_strlcpy(buf_gid, str, sizeof(buf_gid)-1);
994+
g_strlcpy(buf_gid, str, sizeof(buf_gid));
999995
}
1000996
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_INCLUDES)) {
1001-
bzero(buf_includes, sizeof(buf_includes));
1002-
g_strlcpy(buf_includes, str, sizeof(buf_includes)-1);
997+
g_strlcpy(buf_includes, str, sizeof(buf_includes));
1003998
}
1004999
else if (!g_ascii_strcasecmp(*p_key, CFG_KEY_GROUPSONLY)) {
10051000
_str_set_array(FALSE, &groups_only_cfg, str);
@@ -1175,11 +1170,7 @@ _cfg_reload(gboolean services_only, GError **err)
11751170
static guint16
11761171
compute_thread_id(GThread *thread)
11771172
{
1178-
union {
1179-
void *p;
1180-
guint16 u[4];
1181-
} bulk;
1182-
memset(&bulk, 0, sizeof(bulk));
1173+
union { void *p; guint16 u[4]; } bulk = {};
11831174
bulk.p = thread;
11841175
return (bulk.u[0] ^ bulk.u[1]) ^ (bulk.u[2] ^ bulk.u[3]);
11851176
}
@@ -1395,11 +1386,10 @@ static gboolean
13951386
is_gridinit_running(const gchar *path)
13961387
{
13971388
int rc, usock;
1398-
struct sockaddr_un sun;
1389+
struct sockaddr_un sun = {};
13991390

1400-
bzero(&sun, sizeof(sun));
14011391
sun.sun_family = AF_UNIX;
1402-
g_strlcpy(sun.sun_path, path, sizeof(sun.sun_path) - 1);
1392+
g_strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
14031393

14041394
if (0 > (usock = socket(PF_UNIX, SOCK_STREAM, 0)))
14051395
return FALSE;
@@ -1554,6 +1544,9 @@ main(int argc, char ** args)
15541544
supervisor_children_fini();
15551545

15561546
g_free(config_path);
1547+
if (*pidfile_path) {
1548+
unlink(pidfile_path);
1549+
}
15571550
closelog();
15581551
return rc;
15591552
}

main/gridinit_cmd.c

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
3131

3232
#include "./gridinit_internals.h"
3333

34+
#define UNUSED __attribute__ ((unused))
35+
3436
#define MINI 0
3537
#define MEDIUM 1
3638

@@ -379,40 +381,40 @@ open_cnx(void)
379381
static int
380382
send_commandv(void (*dumper)(FILE *, void*), void *udata, const char *cmd, int argc, char **args)
381383
{
382-
FILE *req_stream;
383-
if (NULL != (req_stream = open_cnx())) {
384-
fputs(cmd, req_stream);
385-
fputc(' ', req_stream);
386-
for (int i=0; i<argc ;i++) {
387-
fputs(args[i], req_stream);
388-
fputc(' ', req_stream);
389-
}
390-
fputc('\n', req_stream);
391-
392-
fflush(req_stream);
393-
dumper(req_stream, udata);
394-
fclose(req_stream);
384+
FILE *req_stream = open_cnx();
385+
if (!req_stream)
395386
return 1;
387+
388+
fputs(cmd, req_stream);
389+
fputc(' ', req_stream);
390+
for (int i=0; i<argc ;i++) {
391+
fputs(args[i], req_stream);
392+
fputc(' ', req_stream);
396393
}
394+
fputc('\n', req_stream);
397395

396+
fflush(req_stream);
397+
dumper(req_stream, udata);
398+
fclose(req_stream);
398399
return 0;
399400
}
400401

401-
static GList *
402-
_fetch_services(void)
402+
static int
403+
_fetch_services(GList **out)
403404
{
404405
GList *jobs = NULL;
405-
void _on_reply(FILE *in_stream, void *udata) {
406-
(void) udata;
406+
void _on_reply(FILE *in_stream, void *udata UNUSED) {
407407
jobs = read_services_list(in_stream);
408408
}
409409

410410
int rc = send_commandv(_on_reply, NULL, "status", 0, (char*[]){NULL});
411-
if (!rc) {
411+
if (rc != 0) {
412412
g_list_free_full(jobs, (GDestroyNotify)child_info_free);
413-
return NULL;
413+
*out = NULL;
414+
return 1;
414415
} else {
415-
return jobs;
416+
*out = jobs;
417+
return 0;
416418
}
417419
}
418420

@@ -454,7 +456,10 @@ command_status(int lvl, int argc, char **args)
454456
int *counters = alloca(sizeof(int) * (argc+1));
455457
memset(counters, 0, sizeof(int) * (argc+1));
456458

457-
GList *all_jobs = _fetch_services();
459+
GList *all_jobs = NULL;
460+
if (0 != _fetch_services(&all_jobs))
461+
return 1;
462+
458463
GList *jobs = _filter_services(all_jobs, args, counters);
459464
FORMAT format_t = parse_format(format);
460465

@@ -609,7 +614,7 @@ command_start(int argc, char **args)
609614
struct dump_as_is_arg_s dump_args = {};
610615

611616
int rc = send_commandv(dump_as_is, &dump_args, "start", argc, args);
612-
return !rc
617+
return rc
613618
|| dump_args.count_errors != 0
614619
|| dump_args.count_success == 0;
615620
}
@@ -620,35 +625,44 @@ command_kill(int argc, char **args)
620625
struct dump_as_is_arg_s dump_args = {};
621626

622627
int rc = send_commandv(dump_as_is, &dump_args, "stop", argc, args);
623-
return !rc
628+
return rc
624629
|| dump_args.count_errors != 0
625630
|| dump_args.count_success == 0;
626631
}
627632

633+
static gboolean
634+
_all_down(char **args, gboolean *down)
635+
{
636+
GList *all_jobs = NULL;
637+
if (0 != _fetch_services(&all_jobs))
638+
return FALSE;
639+
640+
GList *jobs = _filter_services(all_jobs, args, NULL);
641+
for (GList *l = jobs; l ;l=l->next) {
642+
struct child_info_s *ci = l->data;
643+
if (ci->pid > 0)
644+
*down = FALSE;
645+
}
646+
g_list_free_full(all_jobs, (GDestroyNotify)child_info_free);
647+
g_list_free(jobs);
648+
return TRUE;
649+
}
650+
628651
static int
629652
command_stop(int argc, char **args)
630653
{
631-
gboolean _all_down(void) {
632-
gboolean rc = TRUE;
633-
GList *all_jobs = _fetch_services();
634-
GList *jobs = _filter_services(all_jobs, args, NULL);
635-
for (GList *l = jobs; l ;l=l->next) {
636-
struct child_info_s *ci = l->data;
637-
if (ci->pid > 0)
638-
rc = FALSE;
639-
}
640-
g_list_free_full(all_jobs, (GDestroyNotify)child_info_free);
641-
g_list_free(jobs);
642-
return rc;
643-
}
644654
FORMAT format_t = parse_format(format);
645-
while (!_all_down()) {
655+
for (;;) {
656+
gboolean d = TRUE;
657+
if (!_all_down(args, &d))
658+
return 1;
659+
if (d)
660+
return 0;
646661
/* If standart output format*/
647662
if (format_t != DEFAULT)
648663
g_print("# Stopping...\n");
649-
int rc = command_kill(argc, args);
650-
if (rc != 0)
651-
return rc;
664+
if (0 != command_kill(argc, args))
665+
return 1;
652666
g_usleep(G_TIME_SPAN_SECOND);
653667
}
654668
return 0;
@@ -660,7 +674,7 @@ command_restart(int argc, char **args)
660674
struct dump_as_is_arg_s dump_args = {};
661675

662676
int rc = send_commandv(dump_as_is, &dump_args, "restart", argc, args);
663-
return !rc
677+
return rc
664678
|| dump_args.count_errors != 0
665679
|| dump_args.count_success == 0;
666680
}
@@ -671,19 +685,18 @@ command_repair(int argc, char **args)
671685
struct dump_as_is_arg_s dump_args = {};
672686

673687
int rc = send_commandv(dump_as_is, &dump_args, "repair", argc, args);
674-
return !rc
688+
return rc
675689
|| dump_args.count_errors != 0
676690
|| dump_args.count_success == 0;
677691
}
678692

679693
static int
680-
command_reload(int argc, char **args)
694+
command_reload(int argc UNUSED, char **args UNUSED)
681695
{
682696
struct dump_as_is_arg_s dump_args = {};
683-
(void) argc, (void) args;
684697

685698
int rc = send_commandv(dump_as_is, &dump_args, "reload", 0, (char*[]){NULL});
686-
return !rc
699+
return rc
687700
|| dump_args.count_errors != 0
688701
|| dump_args.count_success == 0;
689702
}

0 commit comments

Comments
 (0)