[РЕШЕНО] Segmentation fault при расчёте SHA1

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

[РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

Доброго дня!
Есть некая библиотека выполняющая в том числе и подсчёт SHA1-хеша файла, использует OpenSSL-0.9.8g.
Библиотека используется на плате с ARM-процессором, компилятор arm-fsl-linux-gnueabi-gcc (4.4.4_09.06.2010) 4.4.4
Проблема в том, что при подсчёте SHA1 приложение использующее эту библиотеку вываливается с Segmentation fault, проблемная функция EVP_DigestFinal_ex.
Для проверки функция была вынесена в тестовое приложение:

Код:

/* * OpenSSL version 0.9.8g * * arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc \ * -Wall -Wextra -Werror -pedantic -Winit-self -Wformat-nonliteral \ * -Wformat-security -Wmissing-include-dirs -Wswitch-default -Wtrigraphs \ * -Wfloat-equal -Wundef -Wshadow -Wbad-function-cast -Wcast-qual \ * -Wcast-align -Wwrite-strings -Wlogical-op -Wsign-conversion -Wconversion \ * -Wstrict-overflow=5 \ * -O2 -std=c99 \ * -I$(OPENSSL_DIR)/include \ * -L$(OPENSSL_DIR) -lcrypto */ #include <stdio.h> #include <unistd.h> #include "openssl/evp.h" #include "openssl/pem.h" #include "openssl/sha.h" int main(int argc, char *argv[]) { EVP_MD_CTX mdctx; const EVP_MD *md = NULL; unsigned char *digest = NULL; unsigned int digest_len = 0; FILE *fd = NULL; char *buf = NULL; if (argc < 2) { printf("Unknown file\n"); exit(-1); } fd = fopen(argv[1], "rb"); if (NULL == fd) { printf("Failed open file %s\n", argv[1]); exit(-1); } printf("File %s opened\n", argv[1]); OpenSSL_add_all_digests(); md = EVP_get_digestbyname("SHA1"); if (NULL == md) { printf("EVP_get_digestbyname failed\n"); exit(-1); } EVP_MD_CTX_init(&mdctx); if (!EVP_DigestInit_ex(&mdctx, md, NULL)) { printf("EVP_DigestInit_ex failed\n"); exit(-1); } printf("OpenSSL init\n"); while (!feof(fd)) { size_t len = 0; buf = malloc(1024); if (NULL == buf) { printf("buffer malloc failed\n"); exit(-1); } len = fread(buf, 1, 1024, fd); if (!len) { free(buf); break; } if (!EVP_DigestUpdate(&mdctx, buf, len)) { printf("EVP_DigestUpdate failed"); exit(-1); } free(buf); } printf("File %s read stop\n", argv[1]); digest = malloc(EVP_MAX_MD_SIZE); if (NULL == digest) { printf("digest malloc failed\n"); exit(-1); } if (!EVP_DigestFinal_ex(&mdctx, digest, &digest_len)) { printf("EVP_DigestFinal_ex failed\n"); exit(-1); } EVP_MD_CTX_cleanup(&mdctx); fclose(fd); printf("File %s hash %x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x\n", argv[1], digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15], digest[16], digest[17], digest[18], digest[19]); return 0; }

Тест нормально работает:

Код: Выделить всё

./sha_test update_sha_nosign.bic
File update_sha_nosign.bic opened
OpenSSL init
File update_sha_nosign.bic read stop
File update_sha_nosign.bic hash 7d5c758edeaaa3d3b6ef6ea20be3a74d36e9315

Вопрос - как диагностировать причину не работоспособности функции в составе библиотеки?
Спасибо.
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение newsrc »

Имеете возможность пересобрать библиотеку для ARM-системы с добавлением printf?
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

Не проблема, но это я уже делал, собсвенно через printf я выяснил, что падает в EVP_DigestFinal_ex.
По воспоминаниям я залезал и в OpenSSL и выяснил и там место падения - стандартные функции memcpy и memset.

Пока проблему решил переходом на более низкоуровневый интефейс SHA1.

Но аналогичная проблема всплыла в блоке проверки подписи файла, падает в PEM_read_RSA_PUBKEY, в тесте - всё хорошо.
Спасибо сказали:
FatZer
Сообщения: 33
ОС: Gentoo

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение FatZer »

gdb на плате запустить не получится?

можно под qemu отлаживать, если там бага воспроизводится...
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

А что я там увижу?
Код библиотеки перед глазами, код OpenSSL тоже не закрыт.
Как я уже говорил, проблема выявлялась при использовании стандартных memcpy/memset, что странно, вызов этих функций в других приложениях на этой плате не приводит к проблемам.
Доступной памяти более чем:

Код: Выделить всё

~ # free
             total         used         free       shared      buffers
Mem:        482700        43468       439232            0            0
-/+ buffers:              43468       439232
Swap:            0            0            0

К сожаления valgrind под ARM отсутствует, я как-то попробовал собрать...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение drBatty »

IMB писал(а):
12.07.2013 15:25
memcpy

может не туда копируете? Там UB при перекрытии областей.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

В смысле? memcpy вызывает OpenSSL внутри себя, не думаю, что он в своих внутренних структурах содержит некорректные указатели.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение drBatty »

IMB писал(а):
12.07.2013 15:51
В смысле? memcpy вызывает OpenSSL внутри себя, не думаю

создатели адобыфлеша тоже не думали.

Фишка вот в чём: memcpy() копирует слова из области А в область Б. Если А и Б не пересекаются, то всё хорошо. Но если пересекаются, то есть два варианта:

1. А лежит ниже Б (т.е. А>Б, считаем 0 сверху), и мы копируем сначала(к большим адресам). В этом случае всё хорошо.

2. А лежит выше Б. Для примера на 10 байт. Первый же байт из А попадёт не только в Б, но и в А+10, который мы ещё не скопировали. Потому память забьётся повторяющейся последовательностью с циклом в 10 байт.

Вот этот порядок копирования может быть любой, но на разных архитектурах он может отличаться. Потому программа может нормально работать в одной архитектуре, но собранная в другую рухнет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

Решил проблему измененением уровня оптимизации, при отказе от использования -O2 проблема исчезла.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение drBatty »

IMB
наверное глюк в компиляторе для ARM. Вы всем поможете, если отправите багрепорт.

http://gcc.gnu.org/bugs/
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

Не уверен, так как минимальный пример в виде отдельного приложения нормально работает и при использовании -O2, в тоже время этот же код в составе библиотеки собранной с использованием -O2 падает.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение Rootlexx »

IMB писал(а):
15.07.2013 14:01
Не уверен, так как минимальный пример в виде отдельного приложения нормально работает и при использовании -O2, в тоже время этот же код в составе библиотеки собранной с использованием -O2 падает.

В любом случае это баг. В компиляторе или библиотеке.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] Segmentation fault при расчёте SHA1

Сообщение IMB »

Rootlexx писал(а):
15.07.2013 14:14
В любом случае это баг. В компиляторе или библиотеке.

Не спорю, но пока я не могу подтвердить, что это баг в компиляторе. Я также не могу подтвердить, что баг в моей библиотеке, так как она нормально отрабатывает на x86-системе, правда собрана другим компилятором gcc (Debian 4.4.5-8) 4.4.5 и использует другую версию openssl 0.9.8o-4squeeze14.
Из различий также есть следующее:
на хосте /lib/libc.so.6 -> libc-2.11.3.so
на плате /lib/libc.so.6 -> libc-2.11.1.so

Вообщем, если появится время, надо будет постараться разобраться.
Спасибо сказали: