diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2026-04-29 13:30:29 -0400 |
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2026-04-29 13:31:23 -0400 |
| commit | 993bbe2539bdc6d872ec404dca1ba130c592e9c0 (patch) | |
| tree | 59d0d44bed56d0776e01979be8fce5e84786591c | |
| parent | 606d7ede233abe2207a0a7445f1015c3545e80a2 (diff) | |
| download | stasis-993bbe2539bdc6d872ec404dca1ba130c592e9c0.tar.gz | |
wheel_package: fix leak on failure
| -rw-r--r-- | src/lib/core/wheel.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/lib/core/wheel.c b/src/lib/core/wheel.c index e254f36..19d1b9e 100644 --- a/src/lib/core/wheel.c +++ b/src/lib/core/wheel.c @@ -692,8 +692,8 @@ static int wheel_metadata_get(const struct Wheel *pkg, const char *wheel_filenam if (wheel_get_file_contents(wheel_filename, "*.dist-info/METADATA", &data)) { return -1; } - const ssize_t result = wheel_parse_metadata(pkg->metadata, data); char *data_orig = data; + const ssize_t result = wheel_parse_metadata(pkg->metadata, data); guard_free(data_orig); return (int) result; } @@ -1142,6 +1142,7 @@ int wheel_get_entry_point(struct Wheel *pkg, const char *filename) { for (size_t i = 0; i < usable_lines; i++) { pkg->entry_point[i] = calloc(1, sizeof(*pkg->entry_point[0])); if (!pkg->entry_point[i]) { + guard_array_n_free(pkg->entry_point, usable_lines + 1); goto GEP_FAIL; } } @@ -1343,41 +1344,54 @@ int wheel_show_info(const struct Wheel *wheel) { } int wheel_package(struct Wheel **pkg, const char *filename) { + int status = 0; if (!filename) { - return WHEEL_PACKAGE_E_FILENAME; + status = WHEEL_PACKAGE_E_FILENAME; + goto fail; } if (!*pkg) { *pkg = calloc(1, sizeof(**pkg)); if (!*pkg) { - return WHEEL_PACKAGE_E_ALLOC; + status = WHEEL_PACKAGE_E_ALLOC; + goto fail; } (*pkg)->metadata = calloc(1, sizeof(*(*pkg)->metadata)); if (!(*pkg)->metadata) { - guard_free(*pkg); - return WHEEL_PACKAGE_E_ALLOC; + status = WHEEL_PACKAGE_E_ALLOC; + goto fail; } } if (wheel_get(pkg, filename) < 0) { - return WHEEL_PACKAGE_E_GET; + status = WHEEL_PACKAGE_E_GET; + goto fail; } if (wheel_metadata_get(*pkg, filename) < 0) { - return WHEEL_PACKAGE_E_GET_METADATA; + status = WHEEL_PACKAGE_E_GET_METADATA; + goto fail; } if (wheel_get_top_level(*pkg, filename) < 0) { - return WHEEL_PACKAGE_E_GET_TOP_LEVEL; + status = WHEEL_PACKAGE_E_GET_TOP_LEVEL; + goto fail; } if (wheel_get_records(*pkg, filename) < 0) { - return WHEEL_PACKAGE_E_GET_RECORDS; + status = WHEEL_PACKAGE_E_GET_RECORDS; + goto fail; } if (wheel_get_entry_point(*pkg, filename) < 0) { - return WHEEL_PACKAGE_E_GET_ENTRY_POINT; + status = WHEEL_PACKAGE_E_GET_ENTRY_POINT; + goto fail; } // Optional marker wheel_get_zip_safe(*pkg, filename); - return WHEEL_PACKAGE_E_SUCCESS; + status = WHEEL_PACKAGE_E_SUCCESS; + return status; + + fail: + wheel_package_free(pkg); + return status; } |
