diff options
author | Ian Munsie <imunsie@au.ibm.com> | 2010-03-11 07:07:24 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-03-15 18:47:02 -0400 |
commit | 8b4017d8c191822f1c93744e7876c9020e6209aa (patch) | |
tree | 6ca42661c6483b0a27dbed39b193575b0ef2c120 | |
parent | dec9951b8ad86c591af7b452966bf48b307a4010 (diff) |
i4l: silence compiler warnings for array access in Eicon DIVA ISDN driver
When compiling this driver, the compiler throws the following warnings:
drivers/isdn/hardware/eicon/message.c:8426: warning: array subscript is above array bounds
drivers/isdn/hardware/eicon/message.c:8427: warning: array subscript is above array bounds
drivers/isdn/hardware/eicon/message.c:8434: warning: array subscript is above array bounds
drivers/isdn/hardware/eicon/message.c:8435: warning: array subscript is above array bounds
drivers/isdn/hardware/eicon/message.c:8436: warning: array subscript is above array bounds
drivers/isdn/hardware/eicon/message.c:8447: warning: array subscript is above array bounds
This arises from the particular semantics the driver is using to write to
the nlc array (static byte[256]). The array has a length in byte 0
followed by a T30_INFO struct starting at byte 1.
The T30_INFO struct has a number of variable length strings after the
station_id entry, which cannot be explicitly defined in the struct and the
driver accesses them with an array index to station_id beyond the length
of station_id.
This patch merely changes the semantics that the driver uses to access the
entries after the station_id entry to use the original 256 byte nlc array
taking the offset and length of the station_id entry to calculate where to
write in the array, thereby silencing the warning.
Signed-off-by: Ian Munsie <imunsie@au.ibm.com>
Cc: Armin Schindler <mac@melware.de>
Cc: Karsten Keil <isdn@linux-pingi.de>
Cc: Stoyan Gaydarov <sgayda2@uiuc.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/isdn/hardware/eicon/message.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c index ae89fb89da64..4bd469b0c631 100644 --- a/drivers/isdn/hardware/eicon/message.c +++ b/drivers/isdn/hardware/eicon/message.c | |||
@@ -8423,17 +8423,17 @@ static word add_b23(PLCI *plci, API_PARSE *bp) | |||
8423 | pos = 0; | 8423 | pos = 0; |
8424 | else | 8424 | else |
8425 | { | 8425 | { |
8426 | ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; | 8426 | nlc[1 + offsetof(T30_INFO, station_id) + 20 + pos++] = ' '; |
8427 | ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; | 8427 | nlc[1 + offsetof(T30_INFO, station_id) + 20 + pos++] = ' '; |
8428 | len = (byte)b3_config_parms[2].length; | 8428 | len = (byte)b3_config_parms[2].length; |
8429 | if (len > 20) | 8429 | if (len > 20) |
8430 | len = 20; | 8430 | len = 20; |
8431 | if (CAPI_MAX_DATE_TIME_LENGTH + 2 + len + 2 + b3_config_parms[3].length <= CAPI_MAX_HEAD_LINE_SPACE) | 8431 | if (CAPI_MAX_DATE_TIME_LENGTH + 2 + len + 2 + b3_config_parms[3].length <= CAPI_MAX_HEAD_LINE_SPACE) |
8432 | { | 8432 | { |
8433 | for (i = 0; i < len; i++) | 8433 | for (i = 0; i < len; i++) |
8434 | ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ((byte *)b3_config_parms[2].info)[1+i]; | 8434 | nlc[1 + offsetof(T30_INFO, station_id) + 20 + pos++] = ((byte *)b3_config_parms[2].info)[1+i]; |
8435 | ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; | 8435 | nlc[1 + offsetof(T30_INFO, station_id) + 20 + pos++] = ' '; |
8436 | ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; | 8436 | nlc[1 + offsetof(T30_INFO, station_id) + 20 + pos++] = ' '; |
8437 | } | 8437 | } |
8438 | } | 8438 | } |
8439 | } | 8439 | } |
@@ -8444,9 +8444,8 @@ static word add_b23(PLCI *plci, API_PARSE *bp) | |||
8444 | ((T30_INFO *)&nlc[1])->head_line_len = (byte)(pos + len); | 8444 | ((T30_INFO *)&nlc[1])->head_line_len = (byte)(pos + len); |
8445 | nlc[0] += (byte)(pos + len); | 8445 | nlc[0] += (byte)(pos + len); |
8446 | for (i = 0; i < len; i++) | 8446 | for (i = 0; i < len; i++) |
8447 | ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ((byte *)b3_config_parms[3].info)[1+i]; | 8447 | nlc[1 + offsetof(T30_INFO, station_id) + 20 + pos++] = ((byte *)b3_config_parms[3].info)[1+i]; |
8448 | } | 8448 | } else |
8449 | else | ||
8450 | ((T30_INFO *)&nlc[1])->head_line_len = 0; | 8449 | ((T30_INFO *)&nlc[1])->head_line_len = 0; |
8451 | 8450 | ||
8452 | plci->nsf_control_bits = 0; | 8451 | plci->nsf_control_bits = 0; |