Есть такой код:
RError RDeviceSSLCreate(RDevice device)
{
u32 portindex = 0;
while (warehouse.devices.data[device].port[portindex])
{
warehouse.devices.data[device].ssl[portindex] =
SSL_new(warehouse.devices.data[device].ctx);
if (!warehouse.devices.data[device].ssl[portindex])
{
ERR_print_errors_fp(stdout);
return R_ERROR_BADSSL;
}
if (!SSL_set_fd(warehouse.devices.data[device].ssl[portindex], warehouse.devices.data[device].socket[portindex]))
{
ERR_print_errors_fp(stdout);
return R_ERROR_BADSSL;
}
if (SSL_connect(warehouse.devices.data[device].ssl[portindex]) == -1)
{
ERR_print_errors_fp(stdout);
return R_ERROR_BADSSL;
}
portindex++;
}
return R_ERROR_SUCCESS;
}
Все стадии кроме последней идут успешно. Вываливается не всегда, а в 1-0.5% случаев. Обычно когда переподключение приходится делать несколько раз (устройство режектит или проблемы связи). Успешно проходит через все стадии и валится на SSL_connect. Примерно так:
#2 0xb727bba0 in ?? () from /lib/libcrypto.so.0
#3 0xb727bc4a in ?? () from /lib/libcrypto.so.0
#4 0xb727c32c in ERR_get_state () from /lib/libcrypto.so.0
#5 0xb727ae91 in ERR_clear_error () from /lib/libcrypto.so.0
#6 0xb7339091 in ssl23_connect () from /lib/libssl.so.0
#7 0xb7348dea in SSL_connect () from /lib/libssl.so.0
#8 0xb7535cd9 in RDeviceSSLCreate (device=5)
at ./code/libratatoskr/devices/devices.c:255
Иногда сваливается на отправке:
Program terminated with signal 11, Segmentation fault.
#0 0xb734576c in ssl3_write () from /lib/libssl.so.0
#0 0xb734576c in ssl3_write () from /lib/libssl.so.0
#1 0xb735afa2 in SSL_write () from /lib/libssl.so.0
#2 0xb754cc78 in sendall (index=1, bytes=..., portindex=0)
at ./code/libratatoskr/definitions/serials.c:114
Может надо что-то еще проверять? Нагуглить удалось только один подобный случай (код матч 99%), но там не сегфолт, а просто без ошибки выходило - оказалось что у него был неблокирующий сокет (у нас блокирующий) и просто не успевало подключиться.