ip maddr show” on an infiniband address causes a stack corruption
Subsystems (2)
PATCH 1/1 ip maddr show” on an infiniband address causes a stack corruption
Hi,
“ip maddr show” on an infiniband address causes a stack corruption because the length of the address for Infiniband (20 bytes, as described in kernel doc Documentation/infiniband/ipoib.txt) does not fit on the 16 bytes of the field in which it gets stored.
The proposed patch increases the size of the hardware address from 4 __u32 to 8 and also adds a check to avoid overriding the available size while parsing the hardware address.
This bug affects current upstream code AFAICT.
Hope this helps,
Cheers,
Olivier.
“ip maddr show ib0” causes a stack corruption because the length of the address for Infiniband (20 see kernel doc Documentation/infiniband/ipoib.txt) does not fit on the 16 bytes of the field in which it gets stored.
The proposed patch increases the size of the hardware address from 4 u32 to 8 and adds a check to avoid overriding the available size while parsing the hardware address.
This bug affects current upstream code and should be reported upstream.
include/utils.h | 2 +- ip/ipmaddr.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
include/utils.h renamed from include/utils.h.hwaddrsize +1 -1
@@ -46,7 +46,7 @@__u8 bytelen;__s16 bitlen;__u32 flags; -__u32 data[4 ]; +__u32 data[8 ]; } inet_prefix;#define PREFIXLEN_SPECIFIED 1
ip/ipmaddr.c renamed from ip/ipmaddr.c.hwaddrsize +4 -4
@@ -43,11 +43,11 @@exit (-1 ); } -static int parse_hex (char *str,unsigned char *addr) +static int parse_hex (char *str,unsigned char *addr,size_t size) {int len=0 ; -while (*str) { +while (*str && (len <2 * size)) {int tmp;if (str[1 ] ==0 )return -1 ;
@@ -104,7 +104,7 @@ m.addr.family =AF_PACKET ; - len =parse_hex (hexa, (unsigned char *)&m.addr.data); + len =parse_hex (hexa, (unsigned char *)&m.addr.data,sizeof (m.addr.data));if (len >=0 ) {struct ma_info *ma =malloc (sizeof (m));
@@ -176,7 +176,7 @@ m.addr.family =AF_INET6 ; - len =parse_hex (hexa, (unsigned char *)&m.addr.data); + len =parse_hex (hexa, (unsigned char *)&m.addr.data,sizeof (m.addr.data));if (len >=0 ) {struct ma_info *ma =malloc (sizeof (m));