diff options
author | Alexander Krotov <ilabdsf@yandex.ru> | 2016-05-19 01:21:58 +0300 |
---|---|---|
committer | FRIGN <dev@frign.de> | 2016-05-19 12:55:45 +0200 |
commit | 3fa775e1dfd5dc38648f88c2f385be1f0fe45605 (patch) | |
tree | c54c26287920107c018b0a347971f17cf9dc4713 | |
parent | c494437937ee01c6d3eb5b630a15e207aae76c25 (diff) |
Improve fread error handling in ff2*
In case of unexpected end of file errno is not set, and strerror(errno)
returns "Success". Caller should distinguish between error and EOF by
calling ferror(3) as described in fread(3).
-rw-r--r-- | ff2jpg.c | 14 | ||||
-rw-r--r-- | ff2png.c | 7 | ||||
-rw-r--r-- | ff2ppm.c | 14 |
3 files changed, 25 insertions, 10 deletions
@@ -80,8 +80,7 @@ main(int argc, char *argv[]) /* header */ if (fread(hdr, sizeof(*hdr), 4, stdin) != 4) { - fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); - return 1; + goto readerr; } if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { fprintf(stderr, "%s: invalid magic value\n", argv0); @@ -124,8 +123,7 @@ main(int argc, char *argv[]) /* write rows */ for (i = 0; i < height; ++i) { if (fread(row, sizeof(uint16_t), rowlen, stdin) != rowlen) { - fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); - return 1; + goto readerr; } for (j = 0, k = 0; j < rowlen; j += 4, k += 3) { a = ntohs(row[j + 3]); @@ -142,4 +140,12 @@ main(int argc, char *argv[]) jpeg_destroy_compress(&cinfo); return 0; +readerr: + if (ferror(stdin)) { + fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); + } else { + fprintf(stderr, "%s: unexpected end of file\n", argv0); + } + + return 1; } @@ -81,8 +81,11 @@ main(int argc, char *argv[]) return 0; readerr: - fprintf(stderr, "%s: fread: ", argv0); - perror(NULL); + if (ferror(stdin)) { + fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); + } else { + fprintf(stderr, "%s: unexpected end of file\n", argv0); + } return 1; } @@ -60,8 +60,7 @@ main(int argc, char *argv[]) /* header */ if (fread(hdr, sizeof(*hdr), 4, stdin) != 4) { - fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); - return 1; + goto readerr; } if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { fprintf(stderr, "%s: invalid magic value\n", argv0); @@ -90,8 +89,7 @@ main(int argc, char *argv[]) /* write rows */ for (i = 0; i < height; ++i) { if (fread(row, sizeof(uint16_t), rowlen, stdin) != rowlen) { - fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); - return 1; + goto readerr; } for (j = 0, k = 0; j < rowlen; j += 4, k += 3) { a = ntohs(row[j + 3]); @@ -108,4 +106,12 @@ main(int argc, char *argv[]) } return 0; +readerr: + if (ferror(stdin)) { + fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno)); + } else { + fprintf(stderr, "%s: unexpected end of file\n", argv0); + } + + return 1; } |