commit 6f26cb2ecbe03d692e63a4f263febfb5a74e4377 from: Stefan Sperling date: Sun Sep 20 23:17:37 2020 UTC convert abort() in diff_output_lines() to error return commit - 7a54ad3ae5d25aa5349668c8d3d3fa048a8f0733 commit + 6f26cb2ecbe03d692e63a4f263febfb5a74e4377 blob - 92887ff151b6faa423752b1fa9baa3c123f19726 blob + 51cb9c7966c778bceaaaf06691252cd4887e5e63 --- include/diff/diff_output.h +++ include/diff/diff_output.h @@ -26,5 +26,5 @@ int diff_output_unidiff(FILE *dest, const struct diff_ const struct diff_result *result, unsigned int context_lines); int diff_output_info(FILE *dest, const struct diff_input_info *info); -void diff_output_lines(FILE *dest, const char *prefix, +int diff_output_lines(FILE *dest, const char *prefix, struct diff_atom *start_atom, unsigned int count); blob - e93c1e9cc1701fc9a4f1d457d33924914bb20adf blob + e9dd89fa1226d66603de9f1e80fd72bca21fefcb --- lib/diff_output.c +++ lib/diff_output.c @@ -15,6 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include #include @@ -25,58 +26,67 @@ #include #include -static char -get_atom_byte(struct diff_atom *atom, off_t off) +static int +get_atom_byte(int *ch, struct diff_atom *atom, off_t off) { - int ch; off_t cur; - if (atom->at != NULL) - return atom->at[off]; + if (atom->at != NULL) { + *ch = atom->at[off]; + return 0; + } cur = ftello(atom->d->root->f); if (cur == -1) - abort(); /* XXX cannot return error */ + return errno; if (cur != atom->pos + off && fseeko(atom->d->root->f, atom->pos + off, SEEK_SET) == -1) - abort(); /* XXX cannot return error */ + return errno; - ch = fgetc(atom->d->root->f); - if (ch == EOF) - abort(); /* XXX cannot return error */ + *ch = fgetc(atom->d->root->f); + if (*ch == EOF && ferror(atom->d->root->f)) + return errno; - return ch; + return 0; } -void +int diff_output_lines(FILE *dest, const char *prefix, struct diff_atom *start_atom, unsigned int count) { struct diff_atom *atom; + int rc; foreach_diff_atom(atom, start_atom, count) { fprintf(dest, "%s", prefix); - int i; + int i, ch; unsigned int len = atom->len; if (len) { - char ch; - ch = get_atom_byte(atom, len - 1); + rc = get_atom_byte(&ch, atom, len - 1); + if (rc) + return rc; if (ch == '\n') len--; if (len) { - ch = get_atom_byte(atom, len - 1); + rc = get_atom_byte(&ch, atom, len - 1); + if (rc) + return rc; if (ch == '\r') len--; } } for (i = 0; i < len; i++) { - char c = get_atom_byte(atom, i); - if ((c < 0x20 || c >= 0x7f) && c != '\t') - fprintf(dest, "\\x%02x", (unsigned char)c); + rc = get_atom_byte(&ch, atom, i); + if (rc) + return rc; + if ((ch < 0x20 || ch >= 0x7f) && ch != '\t') + fprintf(dest, "\\x%02x", (unsigned char)ch); else - fprintf(dest, "%c", c); + fprintf(dest, "%c", ch); } fprintf(dest, "\n"); } + + return 0; }