tuse secure snprintf idiom - cngf-pf - continuum model for granular flows with pore-pressure dynamics (renamed from 1d_fd_simple_shear)
 (HTM) git clone git://src.adamsgaard.dk/cngf-pf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fb6ea6a60071ea36a485ef60394b247e00918e89
 (DIR) parent 505d04b123cfb85d445042d88900ed96df6d1d4e
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Thu, 22 Apr 2021 12:30:32 +0200
       
       use secure snprintf idiom
       
       Diffstat:
         M cngf-pf.c                           |      10 ++++++----
         M simulation.c                        |      28 +++++++++++++++++++---------
       
       2 files changed, 25 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/cngf-pf.c b/cngf-pf.c
       t@@ -69,7 +69,7 @@ usage(void)
        int
        main(int argc, char *argv[])
        {
       -        int i, normalize, dt_override;
       +        int i, normalize, dt_override, ret;
                unsigned long iter;
                double new_phi, new_k, filetimeclock;
                struct simulation sim;
       t@@ -228,9 +228,11 @@ main(int argc, char *argv[])
                        usage();
                } ARGEND;
        
       -        if (argc == 1 && argv[0])
       -                snprintf(sim.name, sizeof(sim.name), "%s", argv[0]);
       -        else if (argc > 1)
       +        if (argc == 1 && argv[0]) {
       +                ret = snprintf(sim.name, sizeof(sim.name), "%s", argv[0]);
       +                if (ret < 0 || (size_t)ret >= sizeof(sim.name))
       +                        errx(1, "%s: could not write sim.name", __func__);
       +        } else if (argc > 1)
                        usage();
        
                if (sim.nz < 1)
 (DIR) diff --git a/simulation.c b/simulation.c
       t@@ -20,7 +20,11 @@
        void
        init_sim(struct simulation *sim)
        {
       -        snprintf(sim->name, sizeof(sim->name), DEFAULT_SIMULATION_NAME);
       +        int ret;
       +
       +        ret = snprintf(sim->name, sizeof(sim->name), DEFAULT_SIMULATION_NAME);
       +        if (ret < 0 || (size_t)ret == sizeof(sim->name))
       +                err(1, "%s: could not write simulation name", __func__);
        
                sim->G = 9.81;
        
       t@@ -212,18 +216,21 @@ warn_parameter_value(const char message[],
        static void
        check_float(const char name[], const double value, int *return_status)
        {
       +        int ret;
       +        char message[100];
       +
        #ifdef SHOW_PARAMETERS
                printf("%30s: %.17g\n", name, value);
        #endif
                if (isnan(value)) {
       -                char message[100];
       -
       -                snprintf(message, sizeof(message), "%s is NaN", name);
       +                ret = snprintf(message, sizeof(message), "%s is NaN", name);
       +                if (ret < 0 || (size_t)ret >= sizeof(message))
       +                        errx(1, "%s: message parsing", __func__);
                        warn_parameter_value(message, value, return_status);
                } else if (isinf(value)) {
       -                char message[100];
       -
       -                snprintf(message, sizeof(message), "%s is infinite", name);
       +                ret = snprintf(message, sizeof(message), "%s is infinite", name);
       +                if (ret < 0 || (size_t)ret >= sizeof(message))
       +                        errx(1, "%s: message parsing", __func__);
                        warn_parameter_value(message, value, return_status);
                }
        }
       t@@ -711,11 +718,14 @@ implicit_1d_jacobian_poisson_solver(struct simulation *sim,
        void
        write_output_file(struct simulation *sim, const int normalize)
        {
       +        int ret;
                char outfile[200];
                FILE *fp;
        
       -        snprintf(outfile, sizeof(outfile), "%s.output%05d.txt",
       -                 sim->name, sim->n_file++);
       +        ret = snprintf(outfile, sizeof(outfile), "%s.output%05d.txt",
       +                       sim->name, sim->n_file++);
       +        if (ret < 0 || (size_t)ret >= sizeof(outfile))
       +                errx(1, "%s: outfile snprintf", __func__);
        
                if ((fp = fopen(outfile, "w")) != NULL) {
                        print_output(sim, fp, normalize);