From c14e78d68e7148892268b4eed2d6e1481095a5ea Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Sat, 18 Sep 2010 12:37:47 +0200 Subject: HWHDR: Fix various crashes This patch fixes the HWHDR plugin. The logic of the interaction with exiting plugin was not correctly coded and this was leading to crashes due to the lack of sanity check. --- filter/ulogd_filter_HWHDR.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'filter') diff --git a/filter/ulogd_filter_HWHDR.c b/filter/ulogd_filter_HWHDR.c index 6f7e1d9..0e3f627 100644 --- a/filter/ulogd_filter_HWHDR.c +++ b/filter/ulogd_filter_HWHDR.c @@ -180,42 +180,40 @@ static int interp_mac2str(struct ulogd_pluginstance *pi) if (pp_is_valid(inp, KEY_RAW_MAC_SADDR)) { int fret; + if (! pp_is_valid(inp, KEY_RAW_MAC_ADDRLEN)) + return ULOGD_IRET_ERR; fret = parse_mac2str(ret, ikey_get_ptr(&inp[KEY_RAW_MAC_SADDR]), KEY_MAC_SADDR, ikey_get_u16(&inp[KEY_RAW_MAC_ADDRLEN])); if (fret != ULOGD_IRET_OK) return fret; + /* set MAC type to unknown */ + okey_set_u16(&ret[KEY_MAC_TYPE], ARPHRD_VOID); } if (pp_is_valid(inp, KEY_RAW_MAC)) { - if (ikey_get_u16(&inp[KEY_RAW_MAC_ADDRLEN]) == ETH_ALEN) - okey_set_u16(&ret[KEY_MAC_TYPE], ARPHRD_ETHER); - else - okey_set_u16(&ret[KEY_MAC_TYPE], ARPHRD_VOID); - - return ULOGD_IRET_OK; - } - - if (pp_is_valid(inp, KEY_RAW_TYPE)) { - /* NFLOG with Linux >= 2.6.27 case */ - type = ikey_get_u16(&inp[KEY_RAW_TYPE]); - okey_set_u16(&ret[KEY_MAC_TYPE], type); - } else { - /* ULOG case, treat ethernet encapsulation */ - if (ikey_get_u16(&inp[KEY_RAW_MACLEN]) == ETH_HLEN) { - type = ARPHRD_ETHER; - okey_set_u16(&ret[KEY_MAC_TYPE], type); + if (! pp_is_valid(inp, KEY_RAW_MACLEN)) + return ULOGD_IRET_ERR; + if (pp_is_valid(inp, KEY_RAW_TYPE)) { + /* NFLOG with Linux >= 2.6.27 case */ + type = ikey_get_u16(&inp[KEY_RAW_TYPE]); } else { - type = ARPHRD_VOID; - okey_set_u16(&ret[KEY_MAC_TYPE], type); + /* ULOG case, treat ethernet encapsulation */ + if (ikey_get_u16(&inp[KEY_RAW_MACLEN]) == ETH_HLEN) + type = ARPHRD_ETHER; + else + type = ARPHRD_VOID; } + okey_set_u16(&ret[KEY_MAC_TYPE], type); } switch (type) { case ARPHRD_ETHER: parse_ethernet(ret, inp); default: + if (!pp_is_valid(inp, KEY_RAW_MAC)) + return ULOGD_IRET_OK; /* convert raw header to string */ return parse_mac2str(ret, ikey_get_ptr(&inp[KEY_RAW_MAC]), -- cgit v1.2.3