Ошибка неинициализированной памяти при использовании библиотеки 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

0 ответов

Другие вопросы по тегам