|
7 | 7 | import com.digitalpetri.modbus.exceptions.ModbusExecutionException;
|
8 | 8 | import com.digitalpetri.modbus.exceptions.ModbusResponseException;
|
9 | 9 | import com.digitalpetri.modbus.exceptions.ModbusTimeoutException;
|
| 10 | +import com.digitalpetri.modbus.internal.util.Hex; |
10 | 11 | import com.digitalpetri.modbus.pdu.ModbusPdu;
|
11 | 12 | import com.digitalpetri.modbus.pdu.ModbusRequestPdu;
|
12 | 13 | import com.digitalpetri.modbus.pdu.ModbusResponsePdu;
|
@@ -181,17 +182,19 @@ private void onFrameReceived(ModbusTcpFrame frame) {
|
181 | 182 | int functionCode = buffer.get(buffer.position()) & 0xFF;
|
182 | 183 |
|
183 | 184 | if (functionCode == promise.functionCode) {
|
184 |
| - try { |
185 |
| - promise.future.complete(buffer); |
186 |
| - } catch (Exception e) { |
187 |
| - promise.future.completeExceptionally(e); |
188 |
| - } |
| 185 | + promise.future.complete(buffer); |
189 | 186 | } else if (functionCode == promise.functionCode + 0x80) {
|
190 |
| - buffer.get(); // skip FC byte |
191 |
| - int exceptionCode = buffer.get() & 0xFF; |
192 |
| - |
193 |
| - promise.future.completeExceptionally( |
194 |
| - new ModbusResponseException(promise.functionCode, exceptionCode)); |
| 187 | + if (buffer.remaining() >= 2) { |
| 188 | + buffer.get(); // skip FC byte |
| 189 | + int exceptionCode = buffer.get() & 0xFF; |
| 190 | + |
| 191 | + promise.future.completeExceptionally( |
| 192 | + new ModbusResponseException(promise.functionCode, exceptionCode)); |
| 193 | + } else { |
| 194 | + promise.future.completeExceptionally( |
| 195 | + new ModbusException( |
| 196 | + "malformed exception response PDU: %s".formatted(Hex.format(buffer)))); |
| 197 | + } |
195 | 198 | } else {
|
196 | 199 | promise.future.completeExceptionally(
|
197 | 200 | new ModbusException("unexpected function code: 0x%02X".formatted(functionCode)));
|
|
0 commit comments