Ошибка неинициализированной памяти при использовании библиотеки zip.h в WSL Ubuntu 22.04.
Я писал код на C, который открывает зашифрованный zip-файл и пытается прочитать его содержимое. Программа работает хорошо, но когда я просматривал код с помощью некоторых инструментов, чтобы убедиться в отсутствии утечек или проблем, я обнаружил странную проблему при анализе кода с помощью дезинфицирующего средства памяти Google (Msan). Валгринд и другие дезинфицирующие средства Google ничего не сообщают, поэтому я не знаю, ошибка ли это или я чего-то не вижу. Последнее обновление WSL с Ubuntu 22.04.2 и последними установленными пакетами.
Вот трассировка ошибки:
Uninitialized bytes in __interceptor_fopen64 at offset 0 inside [0x702000006ba0, 25)
==4630==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x7f944a1ed197 in BIO_new_file (/lib/x86_64-linux-gnu/libcrypto.so.3+0xe2197) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#1 0x7f944a2243ed (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1193ed) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#2 0x7f944a225051 in CONF_modules_load_file_ex (/lib/x86_64-linux-gnu/libcrypto.so.3+0x11a051) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#3 0x7f944a2c9d2f (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1bed2f) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#4 0x7f944a5faf67 in __pthread_once_slow nptl/./nptl/pthread_once.c:116:7
#5 0x7f944a2cd76c in CRYPTO_THREAD_run_once (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1c276c) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#6 0x7f944a2ca795 in OPENSSL_init_crypto (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1bf795) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#7 0x7f944a2f3b1d (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1e8b1d) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#8 0x7f944a2976de (/lib/x86_64-linux-gnu/libcrypto.so.3+0x18c6de) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#9 0x7f944a39f927 (/lib/x86_64-linux-gnu/libcrypto.so.3+0x294927) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#10 0x7f944a3a007d (/lib/x86_64-linux-gnu/libcrypto.so.3+0x29507d) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#11 0x7f944a28b4b2 in EVP_MD_fetch (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1804b2) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#12 0x7f944a2ac9e5 in PKCS5_PBKDF2_HMAC_SHA1 (/lib/x86_64-linux-gnu/libcrypto.so.3+0x1a19e5) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1)
#13 0x7f944a8a2e48 (/lib/x86_64-linux-gnu/libzip.so.4+0x12e48) (BuildId: 02d1d621ce8e46311d39fa109b824b70dc2a7e1e)
#14 0x7f944a8a545a (/lib/x86_64-linux-gnu/libzip.so.4+0x1545a) (BuildId: 02d1d621ce8e46311d39fa109b824b70dc2a7e1e)
#15 0x7f944a898f8a (/lib/x86_64-linux-gnu/libzip.so.4+0x8f8a) (BuildId: 02d1d621ce8e46311d39fa109b824b70dc2a7e1e)
#16 0x7f944a8a3e91 in zip_source_open (/lib/x86_64-linux-gnu/libzip.so.4+0x13e91) (BuildId: 02d1d621ce8e46311d39fa109b824b70dc2a7e1e)
#17 0x7f944a8a3e7f in zip_source_open (/lib/x86_64-linux-gnu/libzip.so.4+0x13e7f) (BuildId: 02d1d621ce8e46311d39fa109b824b70dc2a7e1e)
#18 0x7f944a89c974 in zip_fopen_index_encrypted (/lib/x86_64-linux-gnu/libzip.so.4+0xc974) (BuildId: 02d1d621ce8e46311d39fa109b824b70dc2a7e1e)
SUMMARY: MemorySanitizer: use-of-uninitialized-value (/lib/x86_64-linux-gnu/libcrypto.so.3+0xe2197) (BuildId: f41db69553ac874b43c3ab46a4e0973d2405a1d1) in BIO_new_file
Exiting
А вот минимальный воспроизводимый пример, который вызывает проблему:
#include <stdio.h>
#include <stdlib.h>
#include <zip.h>
#define MAX_STRING_LEN 256
int main() {
char* file = (char*)calloc(MAX_STRING_LEN, sizeof(char));
if (scanf("%s", file) != 1) {
fprintf(stderr, "Error reading file path\n");
return EXIT_FAILURE;
}
int32_t error = EXIT_SUCCESS;
zip_error_t zip_error;
zip_t* zip = zip_open(file, ZIP_RDONLY, &error);
free(file);
if (zip == NULL) {
zip_error_init_with_code(&zip_error, error);
fprintf(stderr, "Failed to open zip archive: %s\n",
zip_error_strerror(&zip_error));
return EXIT_FAILURE;
}
zip_file_t* open_zip = zip_fopen_index_encrypted(zip, 0, ZIP_FL_ENC_GUESS,
"0000"); // Change this String for the password of the Zip file
if (open_zip == NULL) {
zip_close(zip);
return EXIT_FAILURE;
} else {
printf("Zip was opened\n");
}
zip_fclose(open_zip);
zip_close(zip);
return EXIT_SUCCESS;
}
Как я уже сказал, программа работает, но выдает эту ошибку. Важно отметить, что мне удалось воспроизвести ошибку на другом компьютере под управлением WSL Ubuntu 22.04, но когда я запустил ее на другом компьютере с WSL Ubuntu 20.04, ошибка НЕ отображается.
В этом коде чего-то не хватает? Или это баг или ложное срабатывание от Msan.
Компиляция выполнена с помощью:
mkdir -p build/
clang -c -Wall -Wextra -g -fsanitize=memory -std=c17 -I. -I./build -MMD main.c -o build/main.o
mkdir -p bin/
clang -Wall -Wextra -g -fsanitize=memory -I. -I./bin -I./build build/main.o -o bin/zipmem -lzip