3
3
 * Mandos plugin runner - Run Mandos plugins
 
5
 
 * Copyright © 2008-2020 Teddy Hogeborn
 
6
 
 * Copyright © 2008-2020 Björn Påhlsson
 
8
 
 * This file is part of Mandos.
 
10
 
 * Mandos is free software: you can redistribute it and/or modify it
 
11
 
 * under the terms of the GNU General Public License as published by
 
12
 
 * the Free Software Foundation, either version 3 of the License, or
 
13
 
 * (at your option) any later version.
 
15
 
 * Mandos is distributed in the hope that it will be useful, but
 
 
5
 * Copyright © 2008-2017 Teddy Hogeborn
 
 
6
 * Copyright © 2008-2017 Björn Påhlsson
 
 
8
 * This program is free software: you can redistribute it and/or
 
 
9
 * modify it under the terms of the GNU General Public License as
 
 
10
 * published by the Free Software Foundation, either version 3 of the
 
 
11
 * License, or (at your option) any later version.
 
 
13
 * This program is distributed in the hope that it will be useful, but
 
16
14
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
18
16
 * General Public License for more details.
 
20
18
 * You should have received a copy of the GNU General Public License
 
21
 
 * along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
 
 
19
 * along with this program.  If not, see
 
 
20
 * <http://www.gnu.org/licenses/>.
 
23
22
 * Contact the authors at <mandos@recompile.se>.
 
 
26
25
#define _GNU_SOURCE             /* TEMP_FAILURE_RETRY(), getline(),
 
27
26
                                   O_CLOEXEC, pipe2() */
 
28
27
#include <stddef.h>             /* size_t, NULL */
 
29
 
#include <stdlib.h>             /* malloc(), reallocarray(), realloc(),
 
30
 
                                   EXIT_SUCCESS, exit() */
 
 
28
#include <stdlib.h>             /* malloc(), exit(), EXIT_SUCCESS,
 
31
30
#include <stdbool.h>            /* bool, true, false */
 
32
31
#include <stdio.h>              /* fileno(), fprintf(),
 
33
32
                                   stderr, STDOUT_FILENO, fclose() */
 
 
179
178
  /* Resize the pointed-to array to hold one more pointer */
 
180
179
  char **new_array = NULL;
 
182
 
#if defined(__GLIBC_PREREQ) and __GLIBC_PREREQ(2, 26)
 
183
 
    new_array = reallocarray(*array, (size_t)((*len) + 2),
 
186
 
    if(((size_t)((*len) + 2)) > (SIZE_MAX / sizeof(char *))){
 
191
 
      new_array = realloc(*array, (size_t)((*len) + 2)
 
 
181
    new_array = realloc(*array, sizeof(char *)
 
 
182
                        * (size_t) ((*len) + 2));
 
195
183
  } while(new_array == NULL and errno == EINTR);
 
196
184
  /* Malloc check */
 
197
185
  if(new_array == NULL){
 
 
324
312
__attribute__((nonnull))
 
325
313
static void free_plugin(plugin *plugin_node){
 
327
 
  for(char **arg = (plugin_node->argv)+1; *arg != NULL; arg++){
 
 
315
  for(char **arg = plugin_node->argv; *arg != NULL; arg++){
 
330
 
  free(plugin_node->name);
 
331
318
  free(plugin_node->argv);
 
332
319
  for(char **env = plugin_node->environ; *env != NULL; env++){
 
 
576
563
    case '?':                   /* --help */
 
577
564
      state->flags &= ~(unsigned int)ARGP_NO_EXIT; /* force exit */
 
578
565
      argp_state_help(state, state->out_stream, ARGP_HELP_STD_HELP);
 
579
 
      __builtin_unreachable();
 
580
566
    case -3:                    /* --usage */
 
581
567
      state->flags &= ~(unsigned int)ARGP_NO_EXIT; /* force exit */
 
582
568
      argp_state_help(state, state->out_stream,
 
583
569
                      ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
 
584
 
      __builtin_unreachable();
 
585
570
    case 'V':                   /* --version */
 
586
571
      fprintf(state->out_stream, "%s\n", argp_program_version);
 
587
572
      exit(EXIT_SUCCESS);
 
 
720
700
        custom_argc += 1;
 
722
 
#if defined(__GLIBC_PREREQ) and __GLIBC_PREREQ(2, 26)
 
723
 
          char **new_argv = reallocarray(custom_argv, (size_t)custom_argc + 1,
 
726
 
          char **new_argv = NULL;
 
727
 
          if(((size_t)custom_argc + 1) > (SIZE_MAX / sizeof(char *))){
 
731
 
            new_argv = realloc(custom_argv, ((size_t)custom_argc + 1)
 
 
702
          char **new_argv = realloc(custom_argv, sizeof(char *)
 
 
703
                                    * ((size_t)custom_argc + 1));
 
735
704
          if(new_argv == NULL){
 
736
 
            error(0, errno, "reallocarray");
 
 
705
            error(0, errno, "realloc");
 
737
706
            exitstatus = EX_OSERR;
 
 
1123
1092
    new_plugin->pid = pid;
 
1124
1093
    new_plugin->fd = pipefd[0];
 
1127
 
      fprintf(stderr, "Plugin %s started (PID %" PRIdMAX ")\n",
 
1128
 
              new_plugin->name, (intmax_t) (new_plugin->pid));
 
1131
1095
    /* Unblock SIGCHLD so signal handler can be run if this process
 
1132
1096
       has already completed */
 
1133
1097
    ret = (int)TEMP_FAILURE_RETRY(sigprocmask(SIG_UNBLOCK,