if (modbus->category == MODBUS_CAT_NONE) {
if (modbus->function != MODBUS_FUNC_NONE) {
if (modbus->function == tx->function) {
- if (modbus->subfunction != NULL) {
+ if (modbus->has_subfunction) {
SCLogDebug("looking for Modbus server function %d and subfunction %d",
- modbus->function, *(modbus->subfunction));
- ret = (*(modbus->subfunction) == (tx->subFunction))? 1 : 0;
+ modbus->function, modbus->subfunction);
+ ret = (modbus->subfunction == (tx->subFunction))? 1 : 0;
} else {
SCLogDebug("looking for Modbus server function %d", modbus->function);
ret = 1;
DetectModbus *modbus = (DetectModbus *) ptr;
if(modbus) {
- if (modbus->subfunction)
- SCFree(modbus->subfunction);
-
if (modbus->unit_id)
SCFree(modbus->unit_id);
goto error;
}
- /* We have a correct address option */
- modbus->subfunction =(uint16_t *) SCCalloc(1, sizeof(uint16_t));
- if (modbus->subfunction == NULL)
- goto error;
-
- if (StringParseUint16(&(*modbus->subfunction), 10, 0, (const char *)arg) < 0) {
+ if (StringParseUint16(&modbus->subfunction, 10, 0, (const char *)arg) < 0) {
SCLogError(SC_ERR_INVALID_VALUE, "Invalid value for "
"modbus subfunction: %s", (const char*)arg);
goto error;
}
+ modbus->has_subfunction = true;
- SCLogDebug("and subfunction %d", *(modbus->subfunction));
+ SCLogDebug("and subfunction %d", modbus->subfunction);
}
} else {
uint8_t neg = 0;
modbus = (DetectModbus *) de_ctx->sig_list->sm_lists_tail[g_modbus_buffer_id]->ctx;
FAIL_IF_NOT(modbus->function == 8);
- FAIL_IF_NOT(*modbus->subfunction == 4);
+ FAIL_IF_NOT(modbus->subfunction == 4);
SigGroupCleanup(de_ctx);
SigCleanSignatures(de_ctx);
FAIL_IF_NOT((*modbus->unit_id).min == 10);
FAIL_IF_NOT((*modbus->unit_id).mode == mode);
FAIL_IF_NOT(modbus->function == 8);
- FAIL_IF_NOT((*modbus->subfunction) == 4);
+ FAIL_IF_NOT(modbus->subfunction == 4);
SigGroupCleanup(de_ctx);
SigCleanSignatures(de_ctx);
typedef struct DetectModbus_ {
uint8_t category; /** < Modbus function code category to match */
uint8_t function; /** < Modbus function code to match */
- uint16_t *subfunction; /** < Modbus subfunction to match */
+ uint16_t subfunction; /** < Modbus subfunction to match */
+ bool has_subfunction; /** < Modbus subfunction indicator */
uint8_t type; /** < Modbus access type to match */
DetectModbusValue *unit_id; /** < Modbus unit id to match */
DetectModbusValue *address; /** < Modbus address to match */