shithub: jbig2

Download patch

ref: 3fd58726bf2df258643e6898ae8e5fa7d0076ef3
parent: 4b0abdb8ec3a5ec6bf99c6bcfe2b4c5b742c29e8
author: Sebastian Rasmussen <sebras@gmail.com>
date: Tue Mar 24 21:12:52 EDT 2020

jbig2dec: Need to store local copy of error message.

--- a/jbig2dec.c
+++ b/jbig2dec.c
@@ -70,7 +70,7 @@
 
 typedef struct {
     int verbose;
-    const char *last_message;
+    char *last_message;
     Jbig2Severity severity;
     char *type;
     long repeats;
@@ -402,9 +402,15 @@
         break;
     }
 
-    if (state->last_message == NULL || (state->last_message != NULL && strcmp(message, state->last_message) && state->severity == severity && state->type == type)) {
-        if (state->repeats > 1)
-        {
+    if (state->last_message != NULL && !strcmp(message, state->last_message) && state->severity == severity && state->type == type) {
+        state->repeats++;
+        if (state->repeats % 1000000 == 0) {
+            ret = fprintf(stderr, "jbig2dec %s last message repeated %ld times so far\n", state->type, state->repeats);
+            if (ret < 0)
+                goto printerror;
+        }
+    } else {
+        if (state->repeats > 1) {
             ret = fprintf(stderr, "jbig2dec %s last message repeated %ld times\n", state->type, state->repeats);
             if (ret < 0)
                 goto printerror;
@@ -417,16 +423,19 @@
         if (ret < 0)
             goto printerror;
 
-        state->last_message = message;
+        state->repeats = 0;
         state->severity = severity;
         state->type = type;
-        state->repeats = 0;
-    } else if (state->last_message != NULL) {
-        state->repeats++;
-        if (state->repeats % 1000000 == 0) {
-            ret = fprintf(stderr, "jbig2dec %s last message repeated %ld times so far\n", state->type, state->repeats);
-            if (ret < 0)
-                goto printerror;
+        free(state->last_message);
+        state->last_message = NULL;
+
+        if (message) {
+            state->last_message = strdup(message);
+            if (state->last_message == NULL) {
+                ret = fprintf(stderr, "jbig2dec WARNING could not duplicate message\n");
+                if (ret < 0)
+                    goto printerror;
+            }
         }
     }
 
@@ -434,8 +443,9 @@
 
 printerror:
     fprintf(stderr, "jbig2dec WARNING could not print message\n");
-    state->last_message = NULL;
     state->repeats = 0;
+    free(state->last_message);
+    state->last_message = NULL;
 }
 
 static void
@@ -559,6 +569,12 @@
 
     filearg = parse_options(argc, argv, &params);
 
+    error_callback_state.verbose = params.verbose;
+    error_callback_state.severity = JBIG2_SEVERITY_DEBUG;
+    error_callback_state.type = NULL;
+    error_callback_state.last_message = NULL;
+    error_callback_state.repeats = 0;
+
     if (params.hash)
         hash_init(&params);
 
@@ -604,10 +620,6 @@
             goto cleanup;
         }
 
-        error_callback_state.verbose = params.verbose;
-        error_callback_state.last_message = NULL;
-        error_callback_state.repeats = 0;
-
         if (params.memory_limit == 0)
             allocator = NULL;
         else
@@ -759,6 +771,8 @@
     jbig2_ctx_free(ctx);
     if (params.output_filename)
         free(params.output_filename);
+    if (error_callback_state.last_message)
+        free(error_callback_state.last_message);
     if (params.hash)
         hash_free(&params);