net: ipmr/ip6mr: fix potential out-of-bounds vif_table access
Subsystems (3)
PATCH 1/1 net: ipmr/ip6mr: fix potential out-of-bounds vif_table access
commit 65782983286f43e2b14eec2d7287171a9957a754
Author: Patrick McHardy <[email protected]> Date: Wed Mar 17 16:54:20 2010 +0100
net: ipmr/ip6mr: fix potential out-of-bounds vif_table access
mfc_parent of cache entries is used to index into the vif_table and is initialised from mfcctl->mfcc_parent. This can take values of to 2^16-1, while the vif_table has only MAXVIFS (32) entries. The same problem affects ip6mr.
Refuse invalid values to fix a potential out-of-bounds access. Unlike the other validity checks, this is checked in ipmr_mfc_add() instead of the setsockopt handler since its unused in the delete path and might be uninitialized.
net/ipv4/ipmr.c +3 -0
@@ -802,6 +802,9 @@ static int ipmr_mfc_add(struct net *net, struct mfcctl *mfc, int mrtsock)int line;struct mfc_cache *uc, *c, **cp; +if (mfc->mfcc_parent >=MAXVIFS ) +return -ENFILE ; + line =MFC_HASH (mfc->mfcc_mcastgrp.s_addr, mfc->mfcc_origin.s_addr); for (cp = &net->ipv4.mfc_cache_array[line];
net/ipv6/ip6mr.c +3 -0
@@ -1113,6 +1113,9 @@ static int ip6mr_mfc_add(struct net *net, struct mf6cctl *mfc, int mrtsock)unsigned char ttls[MAXMIFS ];int i; +if (mfc->mf6cc_parent >=MAXMIFS ) +return -ENFILE ; +memset (ttls,255 ,MAXMIFS );for (i =0 ; i <MAXMIFS ; i++) {if (IF_ISSET (i, &mfc->mf6cc_ifset))
My appologies for using git-show again. Correctly formatted patch attached.
mfc_parent of cache entries is used to index into the vif_table and is initialised from mfcctl->mfcc_parent. This can take values of to 2^16-1, while the vif_table has only MAXVIFS (32) entries. The same problem affects ip6mr.
Refuse invalid values to fix a potential out-of-bounds access. Unlike the other validity checks, this is checked in ipmr_mfc_add() instead of the setsockopt handler since its unused in the delete path and might be uninitialized.
--- net/ipv4/ipmr.c | 3 +++ net/ipv6/ip6mr.c | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-)
net/ipv4/ipmr.c +3 -0
@@ -802,6 +802,9 @@ static int ipmr_mfc_add(struct net *net, struct mfcctl *mfc, int mrtsock)int line;struct mfc_cache *uc, *c, **cp; +if (mfc->mfcc_parent >=MAXVIFS ) +return -ENFILE ; + line =MFC_HASH (mfc->mfcc_mcastgrp.s_addr, mfc->mfcc_origin.s_addr); for (cp = &net->ipv4.mfc_cache_array[line];
net/ipv6/ip6mr.c +3 -0
@@ -1113,6 +1113,9 @@ static int ip6mr_mfc_add(struct net *net, struct mf6cctl *mfc, int mrtsock)unsigned char ttls[MAXMIFS ];int i; +if (mfc->mf6cc_parent >=MAXMIFS ) +return -ENFILE ; +memset (ttls,255 ,MAXMIFS );for (i =0 ; i <MAXMIFS ; i++) {if (IF_ISSET (i, &mfc->mf6cc_ifset))
Signature · 1 line
1.6.5.7
From: Patrick McHardy <[email protected]>
Date: Wed, 17 Mar 2010 17:04:14 +0100
Quoted 2 lines
My appologies for using git-show again. Correctly formatted patch attached.
Applied, thanks.