summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2018-11-13 04:18:21 +0100
committerSebastian Rasmussen <sebras@gmail.com>2018-11-14 16:32:46 +0100
commitf1756124f0f3c542bd6c2a9b325dea6bf860fc61 (patch)
tree71130030023406776c3a2c509ced90f84ce069f0 /base
parentbcb605e49dbe306ba881818466f8be591510a9ab (diff)
downloadghostpdl-f1756124f0f3c542bd6c2a9b325dea6bf860fc61.tar.gz
jbig2dec: Only print repeated error/warning messages once.
Diffstat (limited to 'base')
-rw-r--r--base/sjbig2.c86
-rw-r--r--base/sjbig2.h4
2 files changed, 86 insertions, 4 deletions
diff --git a/base/sjbig2.c b/base/sjbig2.c
index cf308869f..89b26b414 100644
--- a/base/sjbig2.c
+++ b/base/sjbig2.c
@@ -66,10 +66,61 @@ s_jbig2decode_error(void *callback_data, const char *msg, Jbig2Severity severity
if (error_data)
{
- if (severity == JBIG2_SEVERITY_FATAL || severity == JBIG2_SEVERITY_WARNING) {
- dmlprintf3(error_data->memory, "jbig2dec %s %s %s\n", type, msg, segment);
- } else {
- if_debug3m('w', error_data->memory, "[w] jbig2dec %s %s %s\n", type, msg, segment);
+ char *message;
+ int len;
+
+ len = snprintf(NULL, 0, "jbig2dec %s %s %s", type, msg, segment);
+ if (len < 0)
+ return;
+
+ message = (char *)gs_alloc_bytes(error_data->memory, len + 1, "sjbig2decode_error(message)");
+ if (message == NULL)
+ return;
+
+ len = snprintf(message, len + 1, "jbig2dec %s %s %s", type, msg, segment);
+ if (len < 0)
+ {
+ gs_free_object(error_data->memory, message, "s_jbig2decode_error(message)");
+ return;
+ }
+
+ if (error_data->last_message != NULL && strcmp(message, error_data->last_message)) {
+ if (error_data->repeats > 1)
+ {
+ if (error_data->severity == JBIG2_SEVERITY_FATAL || error_data->severity == JBIG2_SEVERITY_WARNING) {
+ dmlprintf1(error_data->memory, "jbig2dec last message repeated %ld times\n", error_data->repeats);
+ } else {
+ if_debug1m('w', error_data->memory, "[w] jbig2dec last message repeated %ld times\n", error_data->repeats);
+ }
+ }
+ gs_free_object(error_data->memory, error_data->last_message, "s_jbig2decode_error(last_message)");
+ error_data->last_message = message;
+ error_data->severity = severity;
+ error_data->type = type;
+ error_data->repeats = 0;
+ }
+ else if (error_data->last_message != NULL) {
+ error_data->repeats++;
+ if (error_data->repeats % 1000000 == 0)
+ {
+ if (error_data->severity == JBIG2_SEVERITY_FATAL || error_data->severity == JBIG2_SEVERITY_WARNING) {
+ dmlprintf1(error_data->memory, "jbig2dec last message repeated %ld times so far\n", error_data->repeats);
+ } else {
+ if_debug1m('w', error_data->memory, "[w] jbig2dec last message repeated %ld times so far\n", error_data->repeats);
+ }
+ }
+ gs_free_object(error_data->memory, message, "s_jbig2decode_error(message)");
+ }
+ else if (error_data->last_message == NULL) {
+ if (severity == JBIG2_SEVERITY_FATAL || severity == JBIG2_SEVERITY_WARNING) {
+ dmlprintf1(error_data->memory, "%s\n", message);
+ } else {
+ if_debug1m('w', error_data->memory, "[w] %s\n", message);
+ }
+ error_data->last_message = message;
+ error_data->severity = severity;
+ error_data->type = type;
+ error_data->repeats = 0;
}
}
else
@@ -86,6 +137,29 @@ s_jbig2decode_error(void *callback_data, const char *msg, Jbig2Severity severity
}
}
+static void
+s_jbig2decode_flush_errors(void *callback_data)
+{
+ s_jbig2_callback_data_t *error_data = (s_jbig2_callback_data_t *)callback_data;
+
+ if (error_data == NULL)
+ return;
+
+ if (error_data->last_message != NULL) {
+ if (error_data->repeats > 1)
+ {
+ if (error_data->severity == JBIG2_SEVERITY_FATAL || error_data->severity == JBIG2_SEVERITY_WARNING) {
+ dmlprintf1(error_data->memory, "jbig2dec last message repeated %ld times\n", error_data->repeats);
+ } else {
+ if_debug1m('w', error_data->memory, "[w] jbig2dec last message repeated %ld times\n", error_data->repeats);
+ }
+ }
+ gs_free_object(error_data->memory, error_data->last_message, "s_jbig2decode_error(last_message)");
+ error_data->last_message = NULL;
+ error_data->repeats = 0;
+ }
+}
+
/* invert the bits in a buffer */
/* jbig2 and postscript have different senses of what pixel
value is black, so we must invert the image */
@@ -171,6 +245,8 @@ s_jbig2decode_init(stream_state * ss)
if (state->callback_data) {
state->callback_data->memory = ss->memory->non_gc_memory;
state->callback_data->error = 0;
+ state->callback_data->last_message = NULL;
+ state->callback_data->repeats = 0;
/* initialize the decoder with the parsed global context if any */
state->decode_ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED,
global_ctx, s_jbig2decode_error, state->callback_data);
@@ -249,11 +325,13 @@ s_jbig2decode_release(stream_state *ss)
if (state->decode_ctx) {
if (state->image) jbig2_release_page(state->decode_ctx, state->image);
state->image = NULL;
+ s_jbig2decode_flush_errors(state->callback_data);
jbig2_ctx_free(state->decode_ctx);
state->decode_ctx = NULL;
}
if (state->callback_data) {
gs_memory_t *mem = state->callback_data->memory;
+ gs_free_object(state->callback_data->memory, state->callback_data->last_message, "s_jbig2decode_release(message)");
gs_free_object(mem, state->callback_data, "s_jbig2decode_release(callback_data)");
state->callback_data = NULL;
}
diff --git a/base/sjbig2.h b/base/sjbig2.h
index f94f4b0ec..50289ce94 100644
--- a/base/sjbig2.h
+++ b/base/sjbig2.h
@@ -28,6 +28,10 @@ typedef struct s_jbig2_callback_data_s
{
gs_memory_t *memory;
int error;
+ char *last_message;
+ Jbig2Severity severity;
+ const char *type;
+ long repeats;
} s_jbig2_callback_data_t;
/* See zfjbig2.c for details. */