Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сборка для FreeBSD и много предупреждений #1

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions src/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <ifdhandler.h>
#include <reader.h>
#include <stdio.h>
#include <unistd.h>

#include "misc.h"
#include "commands.h"
Expand Down Expand Up @@ -62,7 +63,7 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char* status);

RESPONSECODE CmdTransmit(unsigned int reader_index, unsigned int tx_length, const unsigned char tx_buffer[]);

RESPONSECODE CmdReceive(unsigned int reader_index, unsigned int *rx_length, unsigned char rx_buffer[]);
RESPONSECODE CmdReceive(unsigned int reader_index, size_t *rx_length, unsigned char rx_buffer[]);

RESPONSECODE CmdReceiveSW(unsigned int reader_index, unsigned char sw[]);

Expand All @@ -73,7 +74,7 @@ RESPONSECODE CmdTranslateRxBuffer(const ifd_iso_apdu_t* iso, unsigned int *rx_le
RESPONSECODE CmdPrepareT0Hdr(ifd_iso_apdu_t* iso, unsigned char hdr[]);

RESPONSECODE CmdSendTPDU(unsigned int reader_index, const void *sbuf,
size_t slen, void *rbuf, size_t rlen, int *rrecv, int iscase4);
size_t slen, void *rbuf, size_t rlen, size_t *rrecv, int iscase4);


/*****************************************************************************
Expand Down Expand Up @@ -102,7 +103,7 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength,
/* we got an error? */
if (r < 0)
{
DEBUG_INFO2("ICC Power On failed: %s", strerror(errno));
DEBUG_INFO2("ICC Power On failed: %s", strerror(errno));
return IFD_COMMUNICATION_ERROR;
}

Expand All @@ -126,7 +127,7 @@ RESPONSECODE CmdPowerOff(unsigned int reader_index)
/* we got an error? */
if (r < 0)
{
DEBUG_INFO2("ICC Power Off failed: %s", strerror(errno));
DEBUG_INFO2("ICC Power Off failed: %s", strerror(errno));
return IFD_COMMUNICATION_ERROR;
}

Expand All @@ -148,7 +149,7 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char* status)
/* we got an error? */
if (r < 0)
{
DEBUG_INFO2("ICC Slot Status failed: %s", strerror(errno));
DEBUG_INFO2("ICC Slot Status failed: %s", strerror(errno));
if (ENODEV == errno)
return IFD_NO_SUCH_DEVICE;
return IFD_COMMUNICATION_ERROR;
Expand All @@ -170,7 +171,7 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char* status)
/* we got an error? */
if (r < 0)
{
DEBUG_INFO2("ICC Slot Status failed: %s", strerror(errno));
DEBUG_INFO2("ICC Slot Status failed: %s", strerror(errno));
if (ENODEV == errno)
return IFD_NO_SUCH_DEVICE;
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -226,7 +227,7 @@ RESPONSECODE CmdTranslateTxBuffer(const ifd_iso_apdu_t* iso, unsigned int* tx_le
*send_buf_trn = malloc(*tx_length);
if (!send_buf_trn)
{
DEBUG_INFO2("out of memory (tx_length = %u)", *tx_length);
DEBUG_INFO2("out of memory (tx_length = %u)", *tx_length);
return IFD_COMMUNICATION_ERROR;
}
memcpy(*send_buf_trn, tx_buffer, *tx_length);
Expand Down Expand Up @@ -371,12 +372,12 @@ RESPONSECODE CmdXfrBlock(unsigned int reader_index, unsigned int tx_length,
iscase4 = 1; /* FIXME: */
case IFD_APDU_CASE_1:
r = CmdSendTPDU(reader_index, send_buf, tx_length,
rx_buffer, *rx_length, &rrecv, iscase4);
rx_buffer, *rx_length, (size_t *)&rrecv, iscase4);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Каст int* к size_t* выглядит как попытка внести уязвимость.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну, по уму, там нужно всю функцию переписать от слова совсем. С заменой разработчика, извините.

Каст int к size_t выглядит как я даже не знаю что.

CmdTranslateRxBuffer ожидает на входе int rrecv, но данные в этот rrecv заносятся как в size_t. У меня, честно, не хватило сил лезть до самого уровня системных вызовов, но 99% - это все-таки size_t, которому пытаются присвоить -1 как признак "ничего мы не получали", а проверяется ли это где-то в цепочке вызово - я понять не осилил.

Ну, то есть, я ставил целью - чтоб собралось без ошибок и предупреждений и работало. Пытаться что-то сломать путем записи токена с какой-нибудь странной длиной я даже не думал. Хотя мысль интересная.

break;
case IFD_APDU_CASE_4S:
// make send case 4 command
r = CmdSendTPDU(reader_index, send_buf, tx_length-1,
rx_buffer, *rx_length, &rrecv, 1);
rx_buffer, *rx_length, (size_t *)&rrecv, 1);
break;
default:
break;
Expand Down Expand Up @@ -431,7 +432,7 @@ RESPONSECODE CmdTransmit(unsigned int reader_index, unsigned int tx_length,
* CmdReceive
*
****************************************************************************/
RESPONSECODE CmdReceive(unsigned int reader_index, unsigned int *rx_length,
RESPONSECODE CmdReceive(unsigned int reader_index, size_t *rx_length,
unsigned char rx_buffer[])
{
_device_descriptor *device_descriptor = get_device_descriptor(reader_index);
Expand Down Expand Up @@ -466,7 +467,7 @@ RESPONSECODE CmdReceive(unsigned int reader_index, unsigned int *rx_length,
RESPONSECODE CmdReceiveSW(unsigned int reader_index, unsigned char sw[])
{
unsigned char status = 0;
int sw_len = 2;
size_t sw_len = 2;
int r = IFD_COMMUNICATION_ERROR;

r = CmdGetSlotStatus(reader_index, &status);
Expand Down Expand Up @@ -540,13 +541,13 @@ RESPONSECODE CmdPrepareT0Hdr(ifd_iso_apdu_t* iso, unsigned char hdr[])
* return in *rrecv how much bytes received
****************************************************************************/
RESPONSECODE CmdSendTPDU(unsigned int reader_index, const void *sbuf,
size_t slen, void *rbuf, size_t rlen, int *rrecv, int iscase4)
size_t slen, void *rbuf, size_t rlen, size_t *rrecv, int iscase4)
{
int r = 0;
unsigned char status;
unsigned char sw[2];
ifd_iso_apdu_t iso;
DEBUG_COMM3("send tpdu command %s, len: %d", array_hexdump(sbuf, slen), slen);
DEBUG_COMM3("send tpdu command %s, len: %zu", array_hexdump(sbuf, slen), slen);

*rrecv = 0;

Expand Down Expand Up @@ -640,7 +641,7 @@ RESPONSECODE CmdSendTPDU(unsigned int reader_index, const void *sbuf,
return CmdSendTPDU(reader_index, hdr,
T0_HDR_LEN, rbuf, rlen, rrecv, 0);
else {
int recvtmp;
size_t recvtmp;
r = CmdSendTPDU(reader_index,
hdr, T0_HDR_LEN, rbuf, rlen, &recvtmp, 0);
if(r != IFD_SUCCESS)
Expand Down Expand Up @@ -671,7 +672,7 @@ RESPONSECODE CmdSendTPDU(unsigned int reader_index, const void *sbuf,
// Add SW to respond
memcpy(((char *)rbuf)+*rrecv, sw, 2);
*rrecv+=2;
DEBUG_COMM2("recv %d bytes", *rrecv);
DEBUG_COMM2("recv %zu bytes", *rrecv);

return IFD_SUCCESS;
}/* CmdSendTPDU */
17 changes: 9 additions & 8 deletions src/convert_apdu.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,13 @@ int convert_doinfo_to_rtprot(void *data, size_t data_len)
DEBUG_COMM3("tag 0x80 (file size) = %02x %02x", dohdr[0], dohdr[1]);
}
data_a5_len = dohdr[1] & 0xff;
if (read_tag(p, data_len, 0xA5, data_a5, data_a5_len) == 0)
if (read_tag(p, data_len, 0xA5, data_a5, data_a5_len) == 0) {
DEBUG_COMM2("tag 0xA5 = %s", array_hexdump(data_a5, data_a5_len));
else
} else {
data_a5_len = 0;
}
if (data_len < sizeof(dohdr) + data_a5_len) {
DEBUG_COMM2("data_len = %u", data_len);
DEBUG_COMM2("data_len = %zu", data_len);
return -1;
}
if (read_tag(p, data_len, 0x83, &dohdr[2], 2) == 0)
Expand Down Expand Up @@ -123,7 +124,7 @@ int convert_fcp_to_rtprot(void *data, size_t data_len)
size_t i;

if (data_len < sizeof(rtprot)) {
DEBUG_COMM2("data_len = %u", data_len);
DEBUG_COMM2("data_len = %zu", data_len);
return -1;
}
/* 0x62 - FCP */
Expand Down Expand Up @@ -170,7 +171,7 @@ int convert_rtprot_to_doinfo(void *data, size_t data_len)
size_t i, doinfo_len = 0;

if (data_len < 32) {
DEBUG_COMM2("data_len = %u", data_len);
DEBUG_COMM2("data_len = %zu", data_len);
return -1;
}
if (pdata[0] != 0 && pdata[0] < sizeof(doinfo) - 4 - 4 - 5 - 42 - 2) {
Expand Down Expand Up @@ -205,7 +206,7 @@ int convert_rtprot_to_doinfo(void *data, size_t data_len)
if (pdata[0] != 0 && pdata[0] + doinfo_len + 2 < sizeof(doinfo)) {
/* Tag 0xA5 */
if (data_len - 32 < pdata[0]) {
DEBUG_INFO2("for tag 0xA5 incorrect data_len = %u", data_len);
DEBUG_INFO2("for tag 0xA5 incorrect data_len = %zu", data_len);
return -1;
}
doinfo[doinfo_len++] = 0xA5;
Expand Down Expand Up @@ -233,7 +234,7 @@ int convert_rtprot_to_fcp(void *data, size_t data_len)
size_t i;

if (data_len < sizeof(fcp)) {
DEBUG_INFO2("data_len = %u", data_len);
DEBUG_INFO2("data_len = %zu", data_len);
return -1;
}
/* Tag 0x81 */
Expand All @@ -257,4 +258,4 @@ int convert_rtprot_to_fcp(void *data, size_t data_len)
DEBUG_COMM2("fcp = %s", array_hexdump(fcp, sizeof(fcp)));
memcpy(data, fcp, sizeof(fcp));
return sizeof(fcp);
}
}
32 changes: 16 additions & 16 deletions src/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,41 +52,41 @@ extern int LogLevel;
#include <debuglog.h>

/* DEBUG_CRITICAL */
#define DEBUG_CRITICAL(fmt) if (LogLevel & DEBUG_LEVEL_CRITICAL) Log1(PCSC_LOG_CRITICAL, fmt); else (fmt)
#define DEBUG_CRITICAL(fmt) if (LogLevel & DEBUG_LEVEL_CRITICAL) { Log1(PCSC_LOG_CRITICAL, fmt); }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Заметка: раньше, если в DEBUG_WTF() попадало вычисление выражения, сайд-эффекты от него наступали и в дебаге, и в релизе. Поскольку оригинально это чужой код, стоит аккуратно посмотреть, нет ли последствий.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, понял, сайд-эффекты отладки. Тут, наверное, лучше оставить, как было


#define DEBUG_CRITICAL2(fmt, data) if (LogLevel & DEBUG_LEVEL_CRITICAL) Log2(PCSC_LOG_CRITICAL, fmt, data); else (fmt, data)
#define DEBUG_CRITICAL2(fmt, data) if (LogLevel & DEBUG_LEVEL_CRITICAL) { Log2(PCSC_LOG_CRITICAL, fmt, data); }

#define DEBUG_CRITICAL3(fmt, data1, data2) if (LogLevel & DEBUG_LEVEL_CRITICAL) Log3(PCSC_LOG_CRITICAL, fmt, data1, data2); else (fmt, data1, data2)
#define DEBUG_CRITICAL3(fmt, data1, data2) if (LogLevel & DEBUG_LEVEL_CRITICAL) { Log3(PCSC_LOG_CRITICAL, fmt, data1, data2); }

#define DEBUG_CRITICAL4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_CRITICAL) Log4(PCSC_LOG_CRITICAL, fmt, data1, data2, data3); else (fmt, data1, data2, data3)
#define DEBUG_CRITICAL4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_CRITICAL) { Log4(PCSC_LOG_CRITICAL, fmt, data1, data2, data3); }

/* DEBUG_INFO */
#define DEBUG_INFO(fmt) if (LogLevel & DEBUG_LEVEL_INFO) Log1(PCSC_LOG_INFO, fmt); else (fmt)
#define DEBUG_INFO(fmt) if (LogLevel & DEBUG_LEVEL_INFO) { Log1(PCSC_LOG_INFO, fmt); }

#define DEBUG_INFO2(fmt, data) if (LogLevel & DEBUG_LEVEL_INFO) Log2(PCSC_LOG_INFO, fmt, data); else (fmt, data)
#define DEBUG_INFO2(fmt, data) if (LogLevel & DEBUG_LEVEL_INFO) { Log2(PCSC_LOG_INFO, fmt, data); }

#define DEBUG_INFO3(fmt, data1, data2) if (LogLevel & DEBUG_LEVEL_INFO) Log3(PCSC_LOG_INFO, fmt, data1, data2); else (fmt, data1, data2)
#define DEBUG_INFO3(fmt, data1, data2) if (LogLevel & DEBUG_LEVEL_INFO) { Log3(PCSC_LOG_INFO, fmt, data1, data2); }

#define DEBUG_INFO4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_INFO) Log4(PCSC_LOG_INFO, fmt, data1, data2, data3); else (fmt, data1, data2, data3)
#define DEBUG_INFO4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_INFO) { Log4(PCSC_LOG_INFO, fmt, data1, data2, data3); }

#define DEBUG_INFO_XXD(msg, buffer, size) if (LogLevel & DEBUG_LEVEL_INFO) log_xxd(PCSC_LOG_INFO, msg, buffer, size); else (msg, buffer, size)
#define DEBUG_INFO_XXD(msg, buffer, size) if (LogLevel & DEBUG_LEVEL_INFO) log_xxd(PCSC_LOG_INFO, msg, buffer, size); }

/* DEBUG_PERIODIC */
#define DEBUG_PERIODIC(fmt) if (LogLevel & DEBUG_LEVEL_PERIODIC) Log1(PCSC_LOG_DEBUG, fmt); else (fmt)
#define DEBUG_PERIODIC(fmt) if (LogLevel & DEBUG_LEVEL_PERIODIC) { Log1(PCSC_LOG_DEBUG, fmt); }

#define DEBUG_PERIODIC2(fmt, data) if (LogLevel & DEBUG_LEVEL_PERIODIC) Log2(PCSC_LOG_DEBUG, fmt, data); else (fmt, data)
#define DEBUG_PERIODIC2(fmt, data) if (LogLevel & DEBUG_LEVEL_PERIODIC) { Log2(PCSC_LOG_DEBUG, fmt, data); }

/* DEBUG_COMM */
#define DEBUG_COMM(fmt) if (LogLevel & DEBUG_LEVEL_COMM) Log1(PCSC_LOG_DEBUG, fmt); else (fmt)
#define DEBUG_COMM(fmt) if (LogLevel & DEBUG_LEVEL_COMM) { Log1(PCSC_LOG_DEBUG, fmt); }

#define DEBUG_COMM2(fmt, data) if (LogLevel & DEBUG_LEVEL_COMM) Log2(PCSC_LOG_DEBUG, fmt, data); else (fmt, data)
#define DEBUG_COMM2(fmt, data) if (LogLevel & DEBUG_LEVEL_COMM) { Log2(PCSC_LOG_DEBUG, fmt, data); }

#define DEBUG_COMM3(fmt, data1, data2) if (LogLevel & DEBUG_LEVEL_COMM) Log3(PCSC_LOG_DEBUG, fmt, data1, data2); else (fmt, data1, data2)
#define DEBUG_COMM3(fmt, data1, data2) if (LogLevel & DEBUG_LEVEL_COMM) { Log3(PCSC_LOG_DEBUG, fmt, data1, data2); }

#define DEBUG_COMM4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_COMM) Log4(PCSC_LOG_DEBUG, fmt, data1, data2, data3); else (fmt, data1, data2, data3)
#define DEBUG_COMM4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_COMM) { Log4(PCSC_LOG_DEBUG, fmt, data1, data2, data3); }

/* DEBUG_XXD */
#define DEBUG_XXD(msg, buffer, size) if (LogLevel & DEBUG_LEVEL_COMM) log_xxd(PCSC_LOG_DEBUG, msg, buffer, size); else (msg, buffer, size)
#define DEBUG_XXD(msg, buffer, size) if (LogLevel & DEBUG_LEVEL_COMM) { log_xxd(PCSC_LOG_DEBUG, msg, buffer, size); }

#endif

Expand Down
26 changes: 13 additions & 13 deletions src/ifdhandler.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice)
if (!DebugInitialized)
init_driver();

DEBUG_INFO3("lun: %X, device: %s", Lun, lpcDevice);
DEBUG_INFO3("lun: %lX, device: %s", Lun, lpcDevice);

if (-1 == (reader_index = GetNewReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -156,7 +156,7 @@ EXTERNAL RESPONSECODE IFDHCreateChannel(DWORD Lun, DWORD Channel)
if (!DebugInitialized)
init_driver();

DEBUG_INFO2("lun: %X", Lun);
DEBUG_INFO2("lun: %lX", Lun);

if (-1 == (reader_index = GetNewReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -203,7 +203,7 @@ EXTERNAL RESPONSECODE IFDHCloseChannel(DWORD Lun)
*/
int reader_index;

DEBUG_INFO2("lun: %X", Lun);
DEBUG_INFO2("lun: %lX", Lun);

if (-1 == (reader_index = LunToReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -234,7 +234,7 @@ static RESPONSECODE IFDHTimedSleep(DWORD Lun, int timeout);

static RESPONSECODE IFDHSleep(DWORD Lun)
{
DEBUG_INFO2("lun: %X", Lun);
DEBUG_INFO2("lun: %lX", Lun);

//wait till thread is not cancelled
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
Expand All @@ -249,7 +249,7 @@ static RESPONSECODE IFDHSleep(DWORD Lun)

static RESPONSECODE IFDHTimedSleep(DWORD Lun, int timeout)
{
DEBUG_INFO2("lun: %X", Lun);
DEBUG_INFO2("lun: %lX", Lun);
(void) timeout;
return IFDHSleep(Lun);
}
Expand All @@ -276,7 +276,7 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag,
*/
int reader_index;

DEBUG_INFO3("lun: %X, tag: 0x%X", Lun, Tag);
DEBUG_INFO3("lun: %lX, tag: 0x%lX", Lun, Tag);

if (-1 == (reader_index = LunToReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -413,7 +413,7 @@ EXTERNAL RESPONSECODE IFDHSetCapabilities(DWORD Lun, DWORD Tag,

/* By default, say it worked */

DEBUG_INFO3("lun: %X, tag: 0x%X", Lun, Tag);
DEBUG_INFO3("lun: %lX, tag: 0x%lX", Lun, Tag);

return IFD_NOT_SUPPORTED;
} /* IFDHSetCapabilities */
Expand Down Expand Up @@ -443,7 +443,7 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol,

int reader_index;

DEBUG_INFO3("lun: %X, protocol T=%d", Lun, Protocol-1);
DEBUG_INFO3("lun: %lX, protocol T=%lu", Lun, Protocol-1);

if (-1 == (reader_index = LunToReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -498,7 +498,7 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action,
int reader_index;
const char *actions[] = { "PowerUp", "PowerDown", "Reset" };

DEBUG_INFO3("lun: %X, action: %s", Lun, actions[Action-IFD_POWER_UP]);
DEBUG_INFO3("lun: %lX, action: %s", Lun, actions[Action-IFD_POWER_UP]);

/* By default, assume it won't work :) */
*AtrLength = 0;
Expand Down Expand Up @@ -599,7 +599,7 @@ EXTERNAL RESPONSECODE IFDHTransmitToICC(DWORD Lun, SCARD_IO_HEADER SendPci,
unsigned int rx_length;
int reader_index;

DEBUG_INFO2("lun: %X", Lun);
DEBUG_INFO2("lun: %lX", Lun);

if (-1 == (reader_index = LunToReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down Expand Up @@ -636,8 +636,8 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode,
*/
int reader_index;

DEBUG_INFO3("lun: %X, ControlCode: 0x%X", Lun, dwControlCode);
DEBUG_INFO_XXD("Control TxBuffer: ", TxBuffer, TxLength);
DEBUG_INFO3("lun: %lX, ControlCode: 0x%lX", Lun, dwControlCode);
/*DEBUG_INFO_XXD("Control TxBuffer: ", TxBuffer, TxLength);*/

reader_index = LunToReaderIndex(Lun);
if ((-1 == reader_index) || (NULL == pdwBytesReturned))
Expand Down Expand Up @@ -667,7 +667,7 @@ EXTERNAL RESPONSECODE IFDHICCPresence(DWORD Lun)
_device_descriptor *device_descriptor;
unsigned int oldReadTimeout;

DEBUG_PERIODIC2("lun: %X", Lun);
DEBUG_PERIODIC2("lun: %lX", Lun);

if (-1 == (reader_index = LunToReaderIndex(Lun)))
return IFD_COMMUNICATION_ERROR;
Expand Down
4 changes: 4 additions & 0 deletions src/rutokens_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
# ifdef __FreeBSD__
# include <stdlib.h>
# include <limits.h>
# endif
# ifdef S_SPLINT_S
# include <sys/types.h>
# endif
Expand Down