Commit 1d4241dff55c5bbaabef9518aed54b883edb492f

Authored by Stéphane Raimbault
1 parent 97ccd92c

Detect abnormal use of compute_header_length and fix comment

Showing 1 changed file with 21 additions and 16 deletions
src/modbus.c
@@ -268,8 +268,7 @@ static unsigned int compute_response_length(modbus_t *ctx, uint8_t *req) @@ -268,8 +268,7 @@ static unsigned int compute_response_length(modbus_t *ctx, uint8_t *req)
268 case FC_READ_HOLDING_REGISTERS: 268 case FC_READ_HOLDING_REGISTERS:
269 case FC_READ_INPUT_REGISTERS: 269 case FC_READ_INPUT_REGISTERS:
270 /* Header + 2 * nb values */ 270 /* Header + 2 * nb values */
271 - length = 2 + 2 * (req[offset + 3] << 8 |  
272 - req[offset + 4]); 271 + length = 2 + 2 * (req[offset + 3] << 8 | req[offset + 4]);
273 break; 272 break;
274 case FC_READ_EXCEPTION_STATUS: 273 case FC_READ_EXCEPTION_STATUS:
275 length = 3; 274 length = 3;
@@ -497,26 +496,32 @@ typedef enum { @@ -497,26 +496,32 @@ typedef enum {
497 MSG_CONFIRMATION 496 MSG_CONFIRMATION
498 } msg_type_t; 497 } msg_type_t;
499 498
500 -/* Computes the header length (to reach the the function code) */ 499 +/* Computes the header length (to reach the real data) */
501 static uint8_t compute_header_length(int function, msg_type_t msg_type) 500 static uint8_t compute_header_length(int function, msg_type_t msg_type)
502 { 501 {
503 int length; 502 int length;
504 503
505 - if (function <= FC_WRITE_SINGLE_COIL ||  
506 - function == FC_WRITE_SINGLE_REGISTER) {  
507 - length = 4;  
508 - } else if (function == FC_WRITE_MULTIPLE_COILS ||  
509 - function == FC_WRITE_MULTIPLE_REGISTERS) {  
510 - length = 5;  
511 - } else if (function == FC_REPORT_SLAVE_ID) {  
512 - if (msg_type == MSG_INDICATION) 504 + if (msg_type == MSG_INDICATION) {
  505 + if (function == FC_REPORT_SLAVE_ID) {
513 length = 0; 506 length = 0;
514 - else 507 + } else {
  508 + /* Should never happen, the other header lengths are precomputed */
  509 + abort();
  510 + }
  511 + } else /* MSG_CONFIRMATION */ {
  512 + if (function <= FC_WRITE_SINGLE_COIL ||
  513 + function == FC_WRITE_SINGLE_REGISTER) {
  514 + length = 4;
  515 + } else if (function == FC_WRITE_MULTIPLE_COILS ||
  516 + function == FC_WRITE_MULTIPLE_REGISTERS) {
  517 + length = 5;
  518 + } else if (function == FC_REPORT_SLAVE_ID) {
515 length = 1; 519 length = 1;
516 - } else if (function == FC_READ_AND_WRITE_REGISTERS) {  
517 - length = 9;  
518 - } else {  
519 - length = 0; 520 + } else if (function == FC_READ_AND_WRITE_REGISTERS) {
  521 + length = 9;
  522 + } else {
  523 + length = 0;
  524 + }
520 } 525 }
521 return length; 526 return length;
522 } 527 }