Skip to content

Commit fa74890

Browse files
committed
Fix: use modbus_free only after object is fully initialised...
fixes double-free crash in unit-test server/client
1 parent acacb7d commit fa74890

File tree

2 files changed

+254
-21
lines changed

2 files changed

+254
-21
lines changed

src/modbus-rtu.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static const uint8_t table_crc_lo[] = {
7272

7373
/* Define the slave ID of the remote device to talk in master mode or set the
7474
* internal slave ID in slave mode */
75-
static int _modbus_set_slave(modbus_t *ctx, int slave)
75+
int _modbus_rtu_set_slave(modbus_t *ctx, int slave)
7676
{
7777
int max_slave = (ctx->quirks & MODBUS_QUIRK_MAX_SLAVE) ? 255 : 247;
7878

@@ -88,7 +88,7 @@ static int _modbus_set_slave(modbus_t *ctx, int slave)
8888
}
8989

9090
/* Builds a RTU request header */
91-
static int _modbus_rtu_build_request_basis(
91+
int _modbus_rtu_build_request_basis(
9292
modbus_t *ctx, int function, int addr, int nb, uint8_t *req)
9393
{
9494
assert(ctx->slave != -1);
@@ -103,7 +103,7 @@ static int _modbus_rtu_build_request_basis(
103103
}
104104

105105
/* Builds a RTU response header */
106-
static int _modbus_rtu_build_response_basis(sft_t *sft, uint8_t *rsp)
106+
int _modbus_rtu_build_response_basis(sft_t *sft, uint8_t *rsp)
107107
{
108108
/* In this case, the slave is certainly valid because a check is already
109109
* done in _modbus_rtu_listen */
@@ -129,14 +129,14 @@ static uint16_t crc16(uint8_t *buffer, uint16_t buffer_length)
129129
return (crc_hi << 8 | crc_lo);
130130
}
131131

132-
static int _modbus_rtu_prepare_response_tid(const uint8_t *req, int *req_length)
132+
int _modbus_rtu_prepare_response_tid(const uint8_t *req, int *req_length)
133133
{
134134
(*req_length) -= _MODBUS_RTU_CHECKSUM_LENGTH;
135135
/* No TID */
136136
return 0;
137137
}
138138

139-
static int _modbus_rtu_send_msg_pre(uint8_t *req, int req_length)
139+
int _modbus_rtu_send_msg_pre(uint8_t *req, int req_length)
140140
{
141141
uint16_t crc = crc16(req, req_length);
142142

@@ -322,10 +322,10 @@ static ssize_t _modbus_rtu_recv(modbus_t *ctx, uint8_t *rsp, int rsp_length)
322322

323323
static int _modbus_rtu_flush(modbus_t *);
324324

325-
static int _modbus_rtu_pre_check_confirmation(modbus_t *ctx,
326-
const uint8_t *req,
327-
const uint8_t *rsp,
328-
int rsp_length)
325+
int _modbus_rtu_pre_check_confirmation(modbus_t *ctx,
326+
const uint8_t *req,
327+
const uint8_t *rsp,
328+
int rsp_length)
329329
{
330330
/* Check responding slave is the slave we requested (except for broacast
331331
* request) */
@@ -346,7 +346,7 @@ static int _modbus_rtu_pre_check_confirmation(modbus_t *ctx,
346346
/* The check_crc16 function shall return 0 if the message is ignored and the
347347
message length if the CRC is valid. Otherwise it shall return -1 and set
348348
errno to EMBBADCRC. */
349-
static int _modbus_rtu_check_integrity(modbus_t *ctx, uint8_t *msg, const int msg_length)
349+
int _modbus_rtu_check_integrity(modbus_t *ctx, uint8_t *msg, const int msg_length)
350350
{
351351
uint16_t crc_calculated;
352352
uint16_t crc_received;
@@ -377,7 +377,7 @@ static int _modbus_rtu_check_integrity(modbus_t *ctx, uint8_t *msg, const int ms
377377
}
378378

379379
if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
380-
_modbus_rtu_flush(ctx);
380+
modbus_flush(ctx);
381381
}
382382
errno = EMBBADCRC;
383383
return -1;
@@ -1184,7 +1184,7 @@ const modbus_backend_t _modbus_rtu_backend = {
11841184
_MODBUS_RTU_HEADER_LENGTH,
11851185
_MODBUS_RTU_CHECKSUM_LENGTH,
11861186
MODBUS_RTU_MAX_ADU_LENGTH,
1187-
_modbus_set_slave,
1187+
_modbus_rtu_set_slave,
11881188
_modbus_rtu_build_request_basis,
11891189
_modbus_rtu_build_response_basis,
11901190
_modbus_rtu_prepare_response_tid,
@@ -1219,15 +1219,23 @@ modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop
12191219
/* Check device argument */
12201220
if (device == NULL || *device == 0) {
12211221
modbus_trace_error(ctx, "The device string is empty\n");
1222+
<<<<<<< Updated upstream
12221223
modbus_free(ctx);
1224+
=======
1225+
free(ctx);
1226+
>>>>>>> Stashed changes
12231227
errno = EINVAL;
12241228
return NULL;
12251229
}
12261230

12271231
/* Check baud argument */
12281232
if (baud == 0) {
12291233
modbus_trace_error(ctx, "The baud rate value must not be zero\n");
1234+
<<<<<<< Updated upstream
12301235
modbus_free(ctx);
1236+
=======
1237+
free(ctx);
1238+
>>>>>>> Stashed changes
12311239
errno = EINVAL;
12321240
return NULL;
12331241
}

0 commit comments

Comments
 (0)