]> granicus.if.org Git - fcron/commitdiff
- removed Flush() macro (replaced by free_safe())
authorThibault Godouet <thib@wind.(none)>
Sun, 10 Jan 2010 17:11:13 +0000 (17:11 +0000)
committerThibault Godouet <thib@wind.(none)>
Sun, 10 Jan 2010 17:11:13 +0000 (17:11 +0000)
- added alloc_safe() and realloc_safe(): wrappers around calloc() and realloc() that die on error
- checked the code to use free_safe(), Set(),  Alloc(), alloc_safe() and realloc_safe() whenever appropriate

16 files changed:
conf.c
convert-fcrontab.c
database.c
doc/en/todo.sgml
env_list.c
fcron.c
fcrondyn.c
fifo_list.c
fileconf.c
global.h
job.c
log.c
socket.c
subs.c
subs.h
u_list.c

diff --git a/conf.c b/conf.c
index 9dce1dbb22b57c43b64c233a99b7e73ac1e59c3f..105d16053836c7e57c513b3832886b9c12327065 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -180,22 +180,22 @@ synchronize_dir(const char *dir_name)
        next = rm_list;
        while( (l = next) != NULL ) {
            next = l->next;
-           free(l->str);
-           free(l);
+           free_safe(l->str);
+           free_safe(l);
        }
            
        next = new_list;
        while( (l = next) != NULL ) {
            next = l->next;
-           free(l->str);
-           free(l);
+           free_safe(l->str);
+           free_safe(l);
        }
 
        next = file_list;
        while( (l = next) != NULL ) {
            next = l->next;
-           free(l->str);
-           free(l);
+           free_safe(l->str);
+           free_safe(l);
        }
 
     }
@@ -382,8 +382,7 @@ read_strn(int fd, char **str, short int size)
 
   err:
     if (*str)
-       free(*str);
-    *str = NULL;
+       free_safe(*str);
     return ERR;
     
 }
@@ -549,7 +548,7 @@ read_file(const char *file_name, cf_t *cf)
     }
     /* get the owner's name */
     /* we set cf->cf_user before for SE Linux, so we need to free it here */
-    free(cf->cf_user);
+    free_safe(cf->cf_user);
     if ( read_strn(fileno(ff), &cf->cf_user, size) != OK ) {
        error("Cannot read user's name : file ignored");
        goto err;
@@ -558,7 +557,7 @@ read_file(const char *file_name, cf_t *cf)
        /* we use file owner's name for more security (see above) */
        /* free the value obtained by read_strn() (we need to read it anyway
         * to set the file ptr to the next thing to read) */
-       free(cf->cf_user);
+       free_safe(cf->cf_user);
        cf->cf_user = runas_str;
     } 
 
@@ -597,7 +596,7 @@ read_file(const char *file_name, cf_t *cf)
                 else {
                     env_list_putenv(cf->cf_env_list, envvar, 1);
                 }
-                free(envvar);
+                free_safe(envvar);
             }
            break;
 
@@ -721,7 +720,7 @@ read_file(const char *file_name, cf_t *cf)
     }
 
     /* free last cl Alloc : unused */
-    free(cl);
+    free_safe(cl);
 
     /* check for an error */
     if ( ferror(ff) != 0 )
@@ -738,10 +737,10 @@ read_file(const char *file_name, cf_t *cf)
 
     if ( cl != NULL && cl->cl_next == NULL ) {
        /* line is not yet in the line list of the file : free it */
-       if ( cl->cl_shell ) free(cl->cl_shell);
-       if ( cl->cl_runas) free(cl->cl_runas);
-       if ( cl->cl_mailto) free(cl->cl_mailto);
-       free(cl);
+       if ( cl->cl_shell ) free_safe(cl->cl_shell);
+       if ( cl->cl_runas) free_safe(cl->cl_runas);
+       if ( cl->cl_mailto) free_safe(cl->cl_mailto);
+       free_safe(cl);
     }
 
     /* check if we have started to read the lines and env var */
@@ -756,7 +755,7 @@ read_file(const char *file_name, cf_t *cf)
        
     }
     else if (cf->cf_user != NULL)
-       free(cf->cf_user);
+       free_safe(cf->cf_user);
 
     return ERR;
 
@@ -774,9 +773,9 @@ add_line_to_file(cl_t *cl, cf_t *cf, uid_t runas, char *runas_str, time_t t_save
        error("Line is not valid (empty shell, runas or mailto field)"
              " : ignored");
        bzero(cl, sizeof(cl));
-       if (cl->cl_shell) free(cl->cl_shell);
-       if (cl->cl_runas) free(cl->cl_runas);
-       if (cl->cl_mailto) free(cl->cl_mailto);
+       if (cl->cl_shell) free_safe(cl->cl_shell);
+       if (cl->cl_runas) free_safe(cl->cl_runas);
+       if (cl->cl_mailto) free_safe(cl->cl_mailto);
        return 1;
     }
 
@@ -797,8 +796,7 @@ add_line_to_file(cl_t *cl, cf_t *cf, uid_t runas, char *runas_str, time_t t_save
                           strcspn(cl->cl_mailto, " \t\n") != strlen(cl->cl_mailto) ) ) {
        error("mailto field \'%s\' is not valid : set to owner %s.", cl->cl_mailto,
              cl->cl_file->cf_user);
-       free(cl->cl_mailto);
-       cl->cl_mailto = strdup2(cl->cl_file->cf_user);
+       Set(cl->cl_mailto,cl->cl_file->cf_user);
     }
 
     /* check if the job hasn't been stopped during execution and insert
@@ -958,8 +956,9 @@ delete_file(const char *user_name)
        /* free serial queue entries */
        for ( i = 0; i < serial_array_size; i++)
            if (serial_array[i] != NULL && serial_array[i]->cl_file == file ) {
-               if ( ! s_a )
-                   s_a = calloc(serial_array_size, sizeof(cl_t *));
+               if ( ! s_a ) {
+                   s_a = alloc_safe(serial_array_size*sizeof(cl_t *), "serial queue");
+                }
                debug("removing %s from serial queue",
                      serial_array[i]->cl_shell);
                serial_num--;
@@ -984,7 +983,7 @@ delete_file(const char *user_name)
                    != NULL)
                    k++;
        }
-       free(serial_array);
+       free_safe(serial_array);
        serial_array = s_a;
        serial_array_index = 0;
 
@@ -1003,17 +1002,17 @@ delete_file(const char *user_name)
                        prev_j->j_next = j->j_next;
                    else
                        queue_base = j->j_next;
-                   free(j);
+                   free_safe(j);
                    break;
                }
                else
                    prev_j = j;
 
            /* free line itself */
-           free(line->cl_shell);
-           free(line->cl_runas);
-           free(line->cl_mailto);
-           free(line);
+           free_safe(line->cl_shell);
+           free_safe(line->cl_runas);
+           free_safe(line->cl_mailto);
+           free_safe(line);
        }
        /* delete_file() MUST remove only the first occurrence :
         * this is needed by synchronize_file() */
@@ -1034,8 +1033,8 @@ delete_file(const char *user_name)
     env_list_destroy(file->cf_env_list);
 
     /* finally free file itself */
-    free(file->cf_user);
-    free(file);
+    free_safe(file->cf_user);
+    free_safe(file);
 
 }
 
index 18cbeddbfd880f533c5f639f7cdc69d72877d60c..1fd3f7aa40e548c22b15d2dbaf8639ba62124aa8 100644 (file)
@@ -119,18 +119,18 @@ delete_file(cf_t *file)
     cur_line = file->cf_line_base;
     while ( (line = cur_line) != NULL) {
        cur_line = line->cl_next;
-       free(line->cl_shell);
-       free(line->cl_mailto);
-       free(line->cl_runas);
-       free(line);
+       free_safe(line->cl_shell);
+       free_safe(line->cl_mailto);
+       free_safe(line->cl_runas);
+       free_safe(line);
     }
 
     /* free env variables */
     env_list_destroy(file->cf_env_list);
 
     /* finally free file itself */
-    free(file->cf_user);
-    free(file);
+    free_safe(file->cf_user);
+    free_safe(file);
 
 }
 
@@ -208,7 +208,7 @@ convert_file(char *file_name)
 
     }
 
-    free(line);
+    free_safe(line);
 
     fclose(f);
 
index 01f77a7e8b5127c64523c07ede4eb3b8a83df73e..7751148a841f28f88a980b739ec2b4e5e481bbf2 100644 (file)
@@ -334,8 +334,7 @@ add_serial_job(cl_t *line, int info_fd)
            debug("Resizing serial_array");
            serial_array_size = (serial_array_size + SERIAL_GROW_SIZE);
        
-           if ( (ptr = calloc(serial_array_size, sizeof(cl_t *))) == NULL )
-               die_e("could not calloc serial_array");
+           ptr = alloc_safe(serial_array_size*sizeof(cl_t *), "serial_array");
 
            /* copy lines in order to have the first line at the index 0 */
            memcpy(ptr + serial_array_index, serial_array,
@@ -343,7 +342,7 @@ add_serial_job(cl_t *line, int info_fd)
            memcpy(ptr, serial_array + (old_size - serial_array_index),
                   (sizeof(cl_t*) * serial_array_index));
            serial_array_index = 0;
-           free(serial_array);
+           free_safe(serial_array);
            serial_array = ptr;
        }
     }
index f8f7a6264df1c632164bb6989830430f2cf41a37..443ba0eb614a9e4382802bc77b61c64347218d25 100644 (file)
@@ -25,7 +25,10 @@ A copy of the license is included in gfdl.sgml.
         <title>High priority</title>
         <itemizedlist>
            <listitem>
-              <para>replace all free() by free_safe()</para>
+              <para>move fcron.conf stuff from subs.{c} to a new fcronconf.{c|h}</para>
+           </listitem>
+           <listitem>
+              <para>change copyright to ...,2008,2009,2010</para>
            </listitem>
            <listitem>
               <para>check fcron for memory leaks using library</para>
index 3ed3d236ff74d2f44f69838daa99b2805ab82531..e3c57ee7d1bda78128fea67d21b92e272df7ac0c 100644 (file)
@@ -73,9 +73,7 @@ env_list_setenv(env_list_t *list, char *name, char *value, int overwrite)
             /* variable already set: overwrite the value if asked
              * and return that entry */
             if ( overwrite == 1 ) {
-                c->e_envvar = realloc(c->e_envvar, len);
-                if ( c->e_envvar == NULL )
-                    die_e("Could not allocate memory to modify env var");
+                c->e_envvar = realloc_safe(c->e_envvar, len, "new env var value");
                 snprintf(c->e_envvar, len, "%s=%s", name, value);
             }
             env_list_end_iteration(list);
@@ -84,7 +82,7 @@ env_list_setenv(env_list_t *list, char *name, char *value, int overwrite)
     }
 
     /* if we're here we didn't find a var called 'name': add it */
-    e.e_envvar = calloc(1, len);
+    e.e_envvar = alloc_safe(len, "new env var");
     snprintf(e.e_envvar, len, "%s=%s", name, value);
     return (env_t *) u_list_add( (u_list_t *) list, (u_list_entry_t *) &e);
 }
@@ -106,9 +104,7 @@ env_list_putenv(env_list_t *list, char *envvar, int overwrite)
             /* variable already set: overwrite the value if asked
              * and return that entry */
             if ( overwrite == 1 ) {
-                c->e_envvar = realloc(c->e_envvar, len);
-                if ( c->e_envvar == NULL )
-                    die_e("Could not allocate memory to modify env var");
+                c->e_envvar = realloc_safe(c->e_envvar, len, "new env var value");
                 memcpy(c->e_envvar, envvar, len); /* includes the final '\0' */
             }
             env_list_end_iteration(list);
@@ -184,15 +180,12 @@ env_list_export_envp(env_list_t *list)
     int i = 0;
     char **envp = NULL;
 
-    envp = calloc(list->num_entries + 1, sizeof(char *)); /* +1 for the end-of-list NULL */
-    if ( envp == NULL )
-           die_e("Could not allocate memory for the environment");
+    /* +1 for the end-of-list NULL */
+    envp = alloc_safe((list->num_entries + 1)*sizeof(char *), "environment export");
 
     for ( c=env_list_first(list), i=0 ; c != NULL && i < list->num_entries ;
             c=env_list_next(list), i++ ) {
         envp[i] = strdup2(c->e_envvar);
-        if ( envp[i] == NULL )
-            die_e("Could not allocate memory for an environment entry");
     }
     /* add a NULL as a end-of-list marker */
     envp[ (list->num_entries + 1 ) - 1] = NULL;
diff --git a/fcron.c b/fcron.c
index 0395dd709d96cd5c77c95d104364aed601f5d24c..df8148e65a1c2823c038078afa5ed5b4c59e6551 100644 (file)
--- a/fcron.c
+++ b/fcron.c
@@ -222,7 +222,7 @@ xexit(int exit_value)
     lavg_list_destroy(lavg_list);
     free_conf();
 
-    free(orig_tz_envvar);
+    free_safe(orig_tz_envvar);
 
     explain("Exiting with code %d", exit_value);
     exit (exit_value);
@@ -608,8 +608,7 @@ main(int argc, char **argv)
     serial_array_index = 0;
     serial_num = 0;
     serial_array_size = SERIAL_INITIAL_SIZE;
-    if ( (serial_array = calloc(serial_array_size, sizeof(cl_t *))) == NULL )
-       die_e("could not calloc serial_array");
+    serial_array = alloc_safe(serial_array_size*sizeof(cl_t *), "serial_array");
 
     /* initialize lavg_array */
     lavg_list = lavg_list_init();
index fc87e98e5ee518bbd40e6a1b9e3ebf35a68795c1..b1bdb5da43822bccae686a44fcd795ccc16f91c8 100644 (file)
@@ -148,7 +148,7 @@ void
 xexit(int exit_val)
     /* clean & exit */
 {
-    Flush(cmd_str);
+    free_safe(cmd_str);
 
     exit(exit_val);
 }
@@ -345,9 +345,7 @@ parse_cmd(char *cmd_str, long int **cmd, int *cmd_len)
        fprintf(stderr, "Warning : too much arguments : '%s' ignored.\n", cmd_str);
 
     /* This is a valid command ... */
-    if ( (*cmd = calloc(*cmd_len, sizeof(long int))) == NULL )
-       die_e("Could not calloc.");
-
+    *cmd = alloc_safe(*cmd_len*sizeof(long int), "command string");
     memcpy(*cmd, buf, *cmd_len * sizeof(long int));
 
     return OK;
@@ -372,7 +370,7 @@ authenticate_user_password(int fd)
     send(fd, buf, len, 0);
     Overwrite(buf);
     Overwrite(password);
-    free(password);
+    free_safe(password);
     
     tv.tv_sec = MAX_WAIT_TIME;
     tv.tv_usec = 0;
@@ -502,7 +500,7 @@ talk_fcron(char *cmd_str, int fd)
        return ERR;
 
     send(fd, cmd, cmd_len * sizeof(long int), 0);
-    Flush(cmd);
+    free_safe(cmd);
     cmd_len = 0;
 
     tv.tv_sec = MAX_WAIT_TIME;
@@ -599,7 +597,7 @@ parseopt(int argc, char *argv[])
            break;
 
        case 'i':
-           Flush(cmd_str);
+           free_safe(cmd_str);
            break;
 
        case 'x':
index 57a20f81c317bcc778e5de2b9ef8222a508f33e1..1304a2f5d97832ea7f7020f2303141c66e6c0793 100644 (file)
@@ -52,10 +52,7 @@ fifo_list_init(size_t entry_size, int init_size, int grow_size)
            "grow_size=%d", entry_size, init_size, grow_size);
 
     /* Allocate the list structure: */
-    l = calloc(1, sizeof(struct fifo_list_t));
-    if ( l == NULL )
-       die_e("Failed creating a new fifo list: could not calloc() fifo_list_t "
-             "(entry_size: %d)", entry_size);
+    l = alloc_safe(sizeof(struct fifo_list_t), "new fifo_list_t");
 
     /* Initialize the structure and allocate the array: */
     l->max_entries = l->num_entries = 0;
@@ -63,10 +60,7 @@ fifo_list_init(size_t entry_size, int init_size, int grow_size)
     l->entry_size = entry_size;
     l->grow_size = grow_size;
     l->first_entry = l->cur_entry = NULL;
-    l->entries_array = calloc(init_size, entry_size);
-    if ( l->entries_array == NULL )
-       die_e("Failed creating a new fifo list: could not calloc array"
-             "(entry_size: %d, init_size: %d)", entry_size, init_size);
+    l->entries_array = alloc_safe(init_size*entry_size, "new fifo_list_t array");
 
     return l;
 }
@@ -115,10 +109,7 @@ fifo_list_resize_array(fifo_list_t *l)
 
     debug("Resizing fifo_list_t (old size: %d, new size: %d)...", old_size, l->array_size);
        
-    if ( (e = calloc(l->array_size, l->entry_size)) == NULL )
-       die_e("Could not calloc fifo_list_t to grow entries_array "
-             "(old size: %d, new size: %d)...", old_size, l->array_size);
-
+    e = alloc_safe(l->array_size*l->entry_size, "larger fifo_list_t array");
     memcpy(e, l->entries_array, (l->entry_size * old_size));
     free_safe(l->entries_array);
     l->entries_array = e;    
index 76d7348decade8c7dac36fda29e937ade21ca8e3..dddbd734189776df0cd7b9600135b87b0cdcd554 100644 (file)
@@ -267,9 +267,9 @@ read_file(char *filename)
 
     fclose(file);
     
-    free(default_line.cl_runas);
-    free(default_line.cl_mailto);
-    free(default_line.cl_tz);
+    free_safe(default_line.cl_runas);
+    free_safe(default_line.cl_mailto);
+    free_safe(default_line.cl_tz);
 
     if ( ! need_correction )
        return OK;
@@ -499,7 +499,7 @@ read_opt(char *ptr, cl_t *cl)
                buf[i++] = *ptr++;
            
            if ( strcmp(buf, "\0") == 0 ) {
-               Flush(cl->cl_tz);
+               free_safe(cl->cl_tz);
            }
            else {
                Set(cl->cl_tz, buf);
@@ -571,7 +571,7 @@ read_opt(char *ptr, cl_t *cl)
                bzero(cl, sizeof(cl_t));
                Set(cl->cl_runas, runas);
                Set(cl->cl_mailto, runas);
-               Flush(cl->cl_tz);
+               free_safe(cl->cl_tz);
                set_default_opt(cl->cl_option);
            }
            if (debug_opt)
@@ -1185,7 +1185,7 @@ read_freq(char *ptr, cf_t *cf)
     if ( strcmp(cl->cl_shell, "\0") == 0 ) {
        fprintf(stderr, "%s:%d: No shell command: skipping line.\n",
                file_name, line);
-       free(cl->cl_shell);
+       free_safe(cl->cl_shell);
        goto exiterr;
     }
 
@@ -1203,7 +1203,7 @@ read_freq(char *ptr, cf_t *cf)
     return;
 
   exiterr:
-    free(cl);
+    free_safe(cl);
     need_correction = 1;
     return;
 }
@@ -1216,7 +1216,7 @@ read_freq(char *ptr, cf_t *cf)
           fprintf(stderr, "\n"); \
       fprintf(stderr, "%s:%d: Error while reading " DESCRP " field: " \
              "skipping line.\n", file_name, line); \
-      free(cl); \
+      free_safe(cl); \
       return; \
   }
 
@@ -1307,7 +1307,7 @@ read_arys(char *ptr, cf_t *cf)
 
   exiterr:
     need_correction = 1;
-    free(cl);
+    free_safe(cl);
     return;
 
 }
@@ -1445,7 +1445,7 @@ read_period(char *ptr, cf_t *cf)
 
   exiterr:
     need_correction = 1;
-    free(cl);
+    free_safe(cl);
     return;
 
 }
@@ -1661,11 +1661,11 @@ delete_file(const char *user_name)
            cur_line = file->cf_line_base;
            while ( (line = cur_line) != NULL) {
                cur_line = line->cl_next;
-               free(line->cl_shell);
-               free(line->cl_mailto);
-               free(line->cl_runas);
-               free(line->cl_tz);
-               free(line);
+               free_safe(line->cl_shell);
+               free_safe(line->cl_mailto);
+               free_safe(line->cl_runas);
+               free_safe(line->cl_tz);
+               free_safe(line);
            }
            break ;
 
@@ -1689,8 +1689,8 @@ delete_file(const char *user_name)
     env_list_destroy(file->cf_env_list);
 
     /* finally free file itself */
-    free(file->cf_user);
-    free(file);
+    free_safe(file->cf_user);
+    free_safe(file);
 
 }
 
index 41acd6d6e8dbfc4209bb71d8c0c428eb43a41cfc..845e577aa4dd00fc297b0d9d407fef7de133b5ba 100644 (file)
--- a/global.h
+++ b/global.h
           VAR = strdup2(VALUE); \
         }
 
-#define Flush(VAR) \
-        { \
-          free(VAR); \
-          VAR = NULL; \
-       }
-
 #define Skip_blanks(PTR) \
         while((*(PTR) == ' ') || (*(PTR) == '\t')) \
            (PTR)++;
diff --git a/job.c b/job.c
index 16d6e4fd05456b0142792aa90b083551b5a8f282..9e784133664c59f46deb599836ea6eeb3ede7695 100644 (file)
--- a/job.c
+++ b/job.c
@@ -246,7 +246,7 @@ change_user_setup_env(struct cl_t *cl,
 
     setup_user_and_env(cl, pas, sendmailenv, jobenv, curshell, curhome);
     become_user(cl, pas, *curhome);
-    free(*curhome);
+    free_safe(*curhome);
 }
 
 void
diff --git a/log.c b/log.c
index d0619d3952563dc984be2a47ce64975b9566764d..7356f33870e72a80dd24eb1b1fdfe5442e85d9e5 100644 (file)
--- a/log.c
+++ b/log.c
@@ -153,7 +153,7 @@ log_syslog(int priority, int fd, char *fmt, va_list args)
     log_console_str(msg);
     log_fd_str(fd, msg);
 
-    free(msg);
+    free_safe(msg);
 }
 
 /* Same as log_syslog(), but also appends an error description corresponding
@@ -172,7 +172,7 @@ log_e(int priority, char *fmt, va_list args)
     log_syslog_str(priority, msg);
     log_console_str(msg);
 
-    free(msg);
+    free_safe(msg);
 }
 
 
@@ -192,7 +192,7 @@ log_pame(int priority, pam_handle_t *pamh, int pamerrno, char *fmt, va_list args
 
     xcloselog();
 
-    free(msg);
+    free_safe(msg);
 }
 #endif
 
@@ -326,7 +326,13 @@ die(char *fmt, ...)
     va_start(args, fmt);
     log_syslog(COMPLAIN_LEVEL, -1, fmt, args);
     va_end(args);
-    if (getpid() == daemon_pid) error("Aborted");
+    if (getpid() == daemon_pid) {
+        error("Aborted");
+    }
+    else {
+        error("fcron child aborted: this does not affect the main fcron daemon,"
+        " but this may prevent a job from being run or an email from being sent.");
+    }
 
     exit(EXIT_ERR);
 
@@ -345,7 +351,14 @@ die_e(char *fmt, ...)
    va_start(args, fmt);
    log_e(COMPLAIN_LEVEL, fmt, args);
    va_end(args);
-   if (getpid() == daemon_pid) error("Aborted");
+   if (getpid() == daemon_pid) {
+        error("Aborted");
+    }
+    else {
+        error("fcron child aborted: this does not affect the main fcron daemon,"
+        " but this may prevent a job from being run or an email from being sent.");
+    }
+
 
    exit(err_no);
 
@@ -400,7 +413,7 @@ send_msg_fd_debug(int fd, char *fmt, ...)
 
     log_fd_str(fd, msg);
 
-    free(msg);
+    free_safe(msg);
 
     va_end(args);
 }
@@ -420,7 +433,7 @@ send_msg_fd(int fd, char *fmt, ...)
 
     log_fd_str(fd, msg);
 
-    free(msg);
+    free_safe(msg);
 
     va_end(args);
 }
index a7d01ff9e819b1fe5004e40555554df21e48431f..3df074284fb18616642e35eae1145cdde408432a 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -849,14 +849,14 @@ and make client points to the next entry */
     debug("connection closed : fd : %d", (*client)->fcl_sock_fd);
     if (prev_client == NULL ) {
        fcrondyn_cl_base = (*client)->fcl_next;
-       Flush((*client)->fcl_user);
-       Flush(*client);
+       free_safe((*client)->fcl_user);
+       free_safe(*client);
        *client = fcrondyn_cl_base;
     }
     else {
        prev_client->fcl_next = (*client)->fcl_next;
-       Flush((*client)->fcl_user);
-       Flush(*client);
+       free_safe((*client)->fcl_user);
+       free_safe(*client);
        *client = prev_client->fcl_next;
     }
     fcrondyn_cl_num -= 1;
@@ -994,7 +994,7 @@ close_socket(void)
            close(client->fcl_sock_fd);
 
            client_buf = client->fcl_next;
-           Flush(client);
+           free_safe(client);
            fcrondyn_cl_num -= 1;
            client = client_buf;
        }
diff --git a/subs.c b/subs.c
index 851b6d5993c816492fc274d6c206d4a7d323a0b5..f7a0eb83004e4e02c1f2bcf59f5563dfafea1f38 100644 (file)
--- a/subs.c
+++ b/subs.c
@@ -142,6 +142,34 @@ strdup2(const char *str)
     return(ptr);
 }
 
+void *
+alloc_safe(size_t len, const char * desc)
+/* allocate len-bytes of memory, and return the pointer.
+ * Die with a log message if there is any error */
+{
+    void *ptr = NULL;
+
+    ptr = calloc(1, len);
+    if ( ptr == NULL ) {
+        die_e("Could not allocate %d bytes of memory%s%s", len, (desc)? "for " : "", desc);
+    }
+    return ptr;
+}
+
+void *
+realloc_safe(void *cur, size_t len, const char * desc)
+/* allocate len-bytes of memory, and return the pointer.
+ * Die with a log message if there is any error */
+{
+    void *new = NULL;
+
+    new = realloc(cur, len);
+    if ( new == NULL ) {
+        die_e("Could not reallocate %d bytes of memory%s%s", len, (desc)? "for " : "", desc);
+    }
+    return new;
+}
+
 void
 free_safe(void *ptr)
     /* free() p and set it to NULL to prevent errors if it is free()ed again */
@@ -279,22 +307,14 @@ read_conf(void)
        while ( isspace( (int) *ptr2 ) ) ptr2++;
 
        /* find which var the line refers to and update it */
-       if ( strncmp(ptr1, "fcrontabs", namesize) == 0 )
-           fcrontabs = strdup2(ptr2);
-       else if ( strncmp(ptr1, "pidfile", namesize) == 0 )
-           pidfile = strdup2(ptr2);
-       else if ( strncmp(ptr1, "fifofile", namesize) == 0 )
-           fifofile = strdup2(ptr2);
-       else if ( strncmp(ptr1, "fcronallow", namesize) == 0 )
-           fcronallow = strdup2(ptr2);
-       else if ( strncmp(ptr1, "fcrondeny", namesize) == 0 )
-           fcrondeny = strdup2(ptr2);
-       else if ( strncmp(ptr1, "shell", namesize) == 0 )
-           shell = strdup2(ptr2);
-       else if ( strncmp(ptr1, "sendmail", namesize) == 0 )
-           sendmail = strdup2(ptr2);
-       else if ( strncmp(ptr1, "editor", namesize) == 0 )
-           editor = strdup2(ptr2);
+       if ( strncmp(ptr1, "fcrontabs", namesize) == 0 ) { Set(fcrontabs, ptr2); }
+       else if ( strncmp(ptr1, "pidfile", namesize) == 0 ) { Set(pidfile, ptr2); }
+       else if ( strncmp(ptr1, "fifofile", namesize) == 0 ) { Set(fifofile , ptr2); }
+       else if ( strncmp(ptr1, "fcronallow", namesize) == 0 ) { Set(fcronallow , ptr2); }
+       else if ( strncmp(ptr1, "fcrondeny", namesize) == 0 ) { Set(fcrondeny , ptr2); }
+       else if ( strncmp(ptr1, "shell", namesize) == 0 ) { Set(shell , ptr2); }
+       else if ( strncmp(ptr1, "sendmail", namesize) == 0 ) { Set(sendmail , ptr2); }
+       else if ( strncmp(ptr1, "editor", namesize) == 0 ) { Set(editor , ptr2); }
        else
            error("Unknown var name at line %s : line ignored", buf);
 
diff --git a/subs.h b/subs.h
index 48aad239ad0f289074d1d0cd6ed9a9666e596a25..6a7c420df235c1d513913ea6f34fefa3313c9994 100644 (file)
--- a/subs.h
+++ b/subs.h
@@ -47,6 +47,8 @@ extern gid_t get_group_gid_safe(char *groupname);
 extern int remove_blanks(char *str);
 extern int strcmp_until(const char *left, const char *right, char until);
 extern char *strdup2(const char *);
+extern void *alloc_safe(size_t len, const char * desc);
+extern void *realloc_safe(void *ptr, size_t len, const char * desc);
 extern void free_safe(void *ptr);
 extern int get_word(char **str);
 extern int temp_file(char **name);
index 52a3a51116b21c4096e616885fd87043e3b0d964..3e1a4db084cf0c6743ffd361283f993eccdd9b55 100644 (file)
--- a/u_list.c
+++ b/u_list.c
@@ -51,10 +51,7 @@ u_list_init(size_t entry_size, int init_size, int grow_size)
                 "grow_size=%d", entry_size, init_size, grow_size);
 
     /* Allocate the list structure: */
-    l = calloc(1, sizeof(struct u_list_t));
-    if ( l == NULL )
-        die_e("Failed creating a new unordered list: could not calloc() u_list_t "
-                "(entry_size: %d)", entry_size);
+    l = alloc_safe(sizeof(struct u_list_t), "new u_list_t");
 
     /* Initialize the structure and allocate the array: */
     l->array_size = init_size;
@@ -62,10 +59,7 @@ u_list_init(size_t entry_size, int init_size, int grow_size)
     l->grow_size = grow_size;
     l->cur_entry = NULL;
     l->cur_removed = 0;
-    l->entries_array = calloc(init_size, entry_size);
-    if ( l->entries_array == NULL )
-        die_e("Failed creating a new unordered list: could not calloc array"
-                "(entry_size: %d, init_size: %d)", entry_size, init_size);
+    l->entries_array = alloc_safe(init_size*entry_size, "new u_list_t array");
 
     return l;
 }
@@ -78,14 +72,13 @@ u_list_copy(u_list_t *list)
     if ( list == NULL )
         return NULL;
 
-    new_list = calloc(1, sizeof(struct u_list_t));
-    if ( new_list == NULL )
-       die_e("Failed copying unordered list: could not calloc() u_list_t");
+    new_list = alloc_safe(sizeof(struct u_list_t), "u_list_t copy");
     memcpy(new_list, list, sizeof(struct u_list_t));
 
     new_list->cur_entry = NULL;
 
-    new_list->entries_array = calloc(list->array_size, list->entry_size);
+    new_list->entries_array = alloc_safe(list->array_size*list->entry_size,
+                                            "u_list_t copy (array)");
     memcpy(new_list->entries_array, list->entries_array,
            (list->array_size * list->entry_size));
 
@@ -121,9 +114,7 @@ u_list_resize_array(u_list_t *l)
 
     debug("Resizing u_list_t (old size: %d, new size: %d)...", old_size, l->array_size);
        
-    if ( (l->entries_array = realloc(l->entries_array, (l->array_size * l->entry_size))) == NULL )
-       die_e("Could not realloc u_list_t to grow entries_array "
-             "(old size: %d, new size: %d)...", old_size, l->array_size);
+    l->entries_array = realloc_safe(l->entries_array, (l->array_size * l->entry_size), "larger u_list_t array");
     /* allocate newly allocated memory */
     memset((char *) l->entries_array+(old_size * l->entry_size), '\0',
            (l->array_size-old_size)*l->entry_size);