diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2014-01-20 05:28:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-21 20:02:52 -0500 |
commit | 08d4d217dff89707471b26348d97258016fcb8ed (patch) | |
tree | 3974c68c132de6cb099244fec1a9600d8ec71b0c /net/rxrpc | |
parent | 2fa053a0a27440ba2ada7acbc0afb11cdae243b2 (diff) |
rxrpc: out of bound read in debug code
Smatch complains because we are using an untrusted index into the
rxrpc_acks[] array. It's just a read and it's only in the debug code,
but it's simple enough to add a check and fix it.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rxrpc')
-rw-r--r-- | net/rxrpc/ar-ack.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/net/rxrpc/ar-ack.c b/net/rxrpc/ar-ack.c index e4d9cbcff402..cd97a0ce48d8 100644 --- a/net/rxrpc/ar-ack.c +++ b/net/rxrpc/ar-ack.c | |||
@@ -21,10 +21,17 @@ | |||
21 | 21 | ||
22 | static unsigned int rxrpc_ack_defer = 1; | 22 | static unsigned int rxrpc_ack_defer = 1; |
23 | 23 | ||
24 | static const char *const rxrpc_acks[] = { | 24 | static const char *rxrpc_acks(u8 reason) |
25 | "---", "REQ", "DUP", "OOS", "WIN", "MEM", "PNG", "PNR", "DLY", "IDL", | 25 | { |
26 | "-?-" | 26 | static const char *const str[] = { |
27 | }; | 27 | "---", "REQ", "DUP", "OOS", "WIN", "MEM", "PNG", "PNR", "DLY", |
28 | "IDL", "-?-" | ||
29 | }; | ||
30 | |||
31 | if (reason >= ARRAY_SIZE(str)) | ||
32 | reason = ARRAY_SIZE(str) - 1; | ||
33 | return str[reason]; | ||
34 | } | ||
28 | 35 | ||
29 | static const s8 rxrpc_ack_priority[] = { | 36 | static const s8 rxrpc_ack_priority[] = { |
30 | [0] = 0, | 37 | [0] = 0, |
@@ -50,7 +57,7 @@ void __rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason, | |||
50 | ASSERTCMP(prior, >, 0); | 57 | ASSERTCMP(prior, >, 0); |
51 | 58 | ||
52 | _enter("{%d},%s,%%%x,%u", | 59 | _enter("{%d},%s,%%%x,%u", |
53 | call->debug_id, rxrpc_acks[ack_reason], ntohl(serial), | 60 | call->debug_id, rxrpc_acks(ack_reason), ntohl(serial), |
54 | immediate); | 61 | immediate); |
55 | 62 | ||
56 | if (prior < rxrpc_ack_priority[call->ackr_reason]) { | 63 | if (prior < rxrpc_ack_priority[call->ackr_reason]) { |
@@ -637,7 +644,7 @@ process_further: | |||
637 | hard, | 644 | hard, |
638 | ntohl(ack.previousPacket), | 645 | ntohl(ack.previousPacket), |
639 | ntohl(ack.serial), | 646 | ntohl(ack.serial), |
640 | rxrpc_acks[ack.reason], | 647 | rxrpc_acks(ack.reason), |
641 | ack.nAcks); | 648 | ack.nAcks); |
642 | 649 | ||
643 | rxrpc_extract_ackinfo(call, skb, latest, ack.nAcks); | 650 | rxrpc_extract_ackinfo(call, skb, latest, ack.nAcks); |
@@ -1180,7 +1187,7 @@ send_ACK: | |||
1180 | ntohl(ack.firstPacket), | 1187 | ntohl(ack.firstPacket), |
1181 | ntohl(ack.previousPacket), | 1188 | ntohl(ack.previousPacket), |
1182 | ntohl(ack.serial), | 1189 | ntohl(ack.serial), |
1183 | rxrpc_acks[ack.reason], | 1190 | rxrpc_acks(ack.reason), |
1184 | ack.nAcks); | 1191 | ack.nAcks); |
1185 | 1192 | ||
1186 | del_timer_sync(&call->ack_timer); | 1193 | del_timer_sync(&call->ack_timer); |