]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Release resources in error paths via cleanup
authorjinyaoguo <guo846@purdue.edu>
Wed, 4 Jun 2025 22:08:11 +0000 (18:08 -0400)
committerjinyaoguo <guo846@purdue.edu>
Wed, 4 Jun 2025 22:08:11 +0000 (18:08 -0400)
Replace direct returns in error-handling branches with a unified
cleanup block that frees allocated resources before returning,
improving code quality and robustness.

tests/bigdict.c
tests/largeDictionary.c
tests/regression/method.c

index 748b60e79b1466e768feea6e6946b25cdbdcf603..33c4ab8ea6d913c3e1a216418874358d0673f529 100644 (file)
@@ -70,39 +70,38 @@ int main(int argc, const char** argv)
     char* buffer = (char*)malloc(bufferSize);
     void* out = malloc(outSize);
     void* roundtrip = malloc(dataSize);
-    int _exit_code = 0;
+    int _exit_code = 1;
     (void)argc;
     (void)argv;
 
     if (!buffer || !out || !roundtrip || !cctx || !dctx) {
         fprintf(stderr, "Allocation failure\n");
-        _exit_code = 1;
         goto cleanup;
     }
 
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 31)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_overlapLog, 9)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, ZSTD_btopt)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_targetLength, 7)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 7)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_searchLog, 1)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_hashLog, 10)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_chainLog, 10)))
-        return 1;
+        goto cleanup;
 
     if (ZSTD_isError(ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 31)))
-        return 1;
+        goto cleanup;
 
     RDG_genBuffer(buffer, bufferSize, 1.0, 0.0, 0xbeefcafe);
 
@@ -112,16 +111,16 @@ int main(int argc, const char** argv)
         for (i = 0; i < 10; ++i) {
             fprintf(stderr, "Compressing 1 GB\n");
             if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_continue))
-                return 1;
+                goto cleanup;
         }
     }
     fprintf(stderr, "Compressing 1 GB\n");
     if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_end))
-        return 1;
+        goto cleanup;
 
     fprintf(stderr, "Success!\n");
 
-    goto cleanup;
+    _exit_code = 0;
 
 cleanup:
     free(roundtrip);
index ff2bb2d7032c6c91f264f8f98dc651df5e6575c0..998fd9fa85c69a2a79011e7530bb31b8237eda9b 100644 (file)
@@ -70,37 +70,38 @@ int main(int argc, const char** argv)
     char* buffer = (char*)malloc(bufferSize);
     void* out = malloc(outSize);
     void* roundtrip = malloc(dataSize);
+    int _exit_code = 1;
     (void)argc;
     (void)argv;
 
     if (!buffer || !out || !roundtrip || !cctx || !dctx) {
         fprintf(stderr, "Allocation failure\n");
-        return 1;
+        goto cleanup;
     }
 
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 31)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_overlapLog, 9)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, ZSTD_btopt)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_targetLength, 7)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 7)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_searchLog, 1)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_hashLog, 10)))
-        return 1;
+        goto cleanup;
     if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_chainLog, 10)))
-        return 1;
+        goto cleanup;
 
     if (ZSTD_isError(ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 31)))
-        return 1;
+        goto cleanup;
 
     RDG_genBuffer(buffer, bufferSize, 1.0, 0.0, 0xbeefcafe);
 
@@ -110,19 +111,20 @@ int main(int argc, const char** argv)
         for (i = 0; i < 10; ++i) {
             fprintf(stderr, "Compressing 1 GB\n");
             if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_continue))
-                return 1;
+                goto cleanup;
         }
     }
     fprintf(stderr, "Compressing 1 GB\n");
     if (compress(cctx, dctx, out, outSize, buffer, dataSize, roundtrip, ZSTD_e_end))
-        return 1;
+        goto cleanup;
 
     fprintf(stderr, "Success!\n");
 
+cleanup:
     free(roundtrip);
     free(out);
     free(buffer);
     ZSTD_freeDCtx(dctx);
     ZSTD_freeCCtx(cctx);
-    return 0;
+    return _exit_code;
 }
index f84a15ef330dfb9c5db21c3e4343458d5236d064..ac6fdd7129c7a6ec1b1ad17c09515d56598dfd8a 100644 (file)
@@ -159,15 +159,15 @@ static result_t compress_cctx_compress(
         return result_error(result_error_skip);
 
     int const level = config_get_level(config);
-
+    result_t result;
     ZSTD_CCtx* cctx = ZSTD_createCCtx();
     ZSTD_DCtx* dctx = ZSTD_createDCtx();
     if (cctx == NULL || dctx == NULL) {
         fprintf(stderr, "context creation failed\n");
-        return result_error(result_error_system_error);
+        result = result_error(result_error_system_error);
+        goto out;
     }
 
-    result_t result;
     result_data_t data = {.total_size = 0};
     for (size_t i = 0; i < state->inputs.size; ++i) {
         data_buffer_t const input = state->inputs.buffers[i];