From b134dfcce71ae6a5ae45bf1ce2e47d024e0d3a7a Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Wed, 5 Apr 2017 15:19:33 -0400 Subject: [PATCH] modbus: fix compiler warnings about alignment app-layer-modbus.c:1226:39: warning: taking address of packed member 'transactionId' of class or structure 'ModbusHeader_' may result in an unaligned pointer value [-Waddress-of-packed-member] if (ModbusExtractUint16(modbus, &(header->transactionId), input, input_len, &offset) || ^~~~~~~~~~~~~~~~~~~~~ app-layer-modbus.c:1228:39: warning: taking address of packed member 'protocolId' of class or structure 'ModbusHeader_' may result in an unaligned pointer value [-Waddress-of-packed-member] ModbusExtractUint16(modbus, &(header->protocolId), input, input_len, &offset) || ^~~~~~~~~~~~~~~~~~ app-layer-modbus.c:1230:39: warning: taking address of packed member 'length' of class or structure 'ModbusHeader_' may result in an unaligned pointer value [-Waddress-of-packed-member] ModbusExtractUint16(modbus, &(header->length), input, input_len, &offset) || ^~~~~~~~~~~~~~ 3 warnings generated. Bug #2088 --- src/app-layer-modbus.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/app-layer-modbus.c b/src/app-layer-modbus.c index cdb47bd863..97fd4be0d7 100644 --- a/src/app-layer-modbus.c +++ b/src/app-layer-modbus.c @@ -1222,15 +1222,30 @@ static int ModbusParseHeader(ModbusState *modbus, SCEnter(); uint16_t offset = 0; + int r = 0; + + /* can't pass the header fields directly due to alignment (Bug 2088) */ + uint16_t transaction_id = 0; + uint16_t protocol_id = 0; + uint16_t length = 0; + uint8_t unit_id = 0; + /* Transaction Identifier (2 bytes) */ - if (ModbusExtractUint16(modbus, &(header->transactionId), input, input_len, &offset) || + r = ModbusExtractUint16(modbus, &transaction_id, input, input_len, &offset); /* Protocol Identifier (2 bytes) */ - ModbusExtractUint16(modbus, &(header->protocolId), input, input_len, &offset) || + r |= ModbusExtractUint16(modbus, &protocol_id, input, input_len, &offset); /* Length (2 bytes) */ - ModbusExtractUint16(modbus, &(header->length), input, input_len, &offset) || + r |= ModbusExtractUint16(modbus, &length, input, input_len, &offset); /* Unit Identifier (1 byte) */ - ModbusExtractUint8(modbus, &(header->unitId), input, input_len, &offset)) + r |= ModbusExtractUint8(modbus, &unit_id, input, input_len, &offset); + + if (r != 0) { SCReturnInt(-1); + } + header->transactionId = transaction_id; + header->protocolId = protocol_id; + header->length = length; + header->unitId = unit_id; SCReturnInt(0); }