diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2019-09-29 16:26:53 +0200 |
---|---|---|
committer | Sebastian Rasmussen <sebras@gmail.com> | 2020-03-20 17:56:07 +0800 |
commit | 1899ce3f1844cf941d19c38fc8de8f126bf7419d (patch) | |
tree | e5abee4722b20d5cb3810a16bef105303d2a8827 /jbig2dec | |
parent | 4239ceeb4dd39e2ac183a01877b62761ae13bae4 (diff) | |
download | ghostpdl-1899ce3f1844cf941d19c38fc8de8f126bf7419d.tar.gz |
jbig2dec: Avoid passing NULL buffer to snprintf().
Diffstat (limited to 'jbig2dec')
-rw-r--r-- | jbig2dec/jbig2dec.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/jbig2dec/jbig2dec.c b/jbig2dec/jbig2dec.c index dad786f3c..39f487ebb 100644 --- a/jbig2dec/jbig2dec.c +++ b/jbig2dec/jbig2dec.c @@ -376,7 +376,6 @@ error_callback(void *error_callback_data, const char *buf, Jbig2Severity severit { jbig2dec_error_callback_state_t *state = (jbig2dec_error_callback_state_t *) error_callback_data; char *type; - char segment[22]; int len; char *message; @@ -403,27 +402,25 @@ error_callback(void *error_callback_data, const char *buf, Jbig2Severity severit type = "unknown message"; break; } - if (seg_idx == -1) - segment[0] = '\0'; - else - snprintf(segment, sizeof(segment), "(segment 0x%02x)", seg_idx); - len = snprintf(NULL, 0, "jbig2dec %s %s %s", type, buf, segment); - if (len < 0) { - return; - } + /* Worst case length using format "jbig2dec %s %s (segment 0x%02x)". + strlen("jbig2dec ") + + strlen(type) + strlen(" ") + + strlen(buf) + strlen(" ") + + strlen("(segment 0x") + strlen("2147483648") + strlen(")") + + 1 for trailing NUL. The constant parts amount to 45 bytes. */ + len = 45; + len += strlen(type); + len += strlen(buf); message = malloc(len + 1); if (message == NULL) { return; } - - len = snprintf(message, len + 1, "jbig2dec %s %s %s", type, buf, segment); - if (len < 0) - { - free(message); - return; - } + if (seg_idx == -1) + snprintf(message, len + 1, "jbig2dec %s %s", type, buf); + else + snprintf(message, len + 1, "jbig2dec %s %s (segment 0x%02x)", type, buf, seg_idx); if (state->last_message != NULL && strcmp(message, state->last_message)) { if (state->repeats > 1) |