From 1637ea7c6439ac88c88bb5d84c764d493aea3093 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Mon, 16 May 2016 21:31:23 +1200 Subject: Refactor closing members of f, fix return code bug on truncated input --- pgm-interlace.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/pgm-interlace.c b/pgm-interlace.c index eeaade4..db7ea2b 100644 --- a/pgm-interlace.c +++ b/pgm-interlace.c @@ -208,6 +208,14 @@ int parse_header(FILE *fd, char *magic, size_t magic_len, long *width, long *hei return 0; } +void close_all(FILE **f, size_t f_len) +{ + size_t i = 0; + + for (i = 0; i < f_len; i++) + fclose(f[i]); +} + /**/ int write_pgm(FILE *fout, unsigned long size, unsigned int white, FILE **fin, size_t fin_len) { @@ -306,18 +314,21 @@ int main(int argc, char **argv) || white != new_white) { fprintf(stderr, "Error: '%s' doesn't have identical header to '%s', stop\n", argv[i+1], argv[1]); + close_all(f, clust_total); return 1; } } fprintf(stderr, "Full image size will be %ldx%ld, using %d images\n", size, size, clust_total); - write_pgm(stdout, size, white, f, clust_total); - - /* close all input files */ - for (i = 1; i < argc; i++) - fclose(f[i-1]); + if (write_pgm(stdout, size, white, f, clust_total)) + { + close_all(f, clust_total); + return 1; + } + close_all(f, clust_total); free(f); + return 0; } -- cgit v1.1