diff options
author | Eric Leblond <eric@inl.fr> | 2010-09-18 12:37:47 +0200 |
---|---|---|
committer | Eric Leblond <eric@inl.fr> | 2010-09-22 01:36:42 +0200 |
commit | c14e78d68e7148892268b4eed2d6e1481095a5ea (patch) | |
tree | 76798be02c5a852ecfd8e4c6e3165e787cb0cda6 /filter | |
parent | daa610f553d67e75b0c3e175d409626b5442c3a4 (diff) |
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.
Diffstat (limited to 'filter')
-rw-r--r-- | filter/ulogd_filter_HWHDR.c | 36 |
1 files changed, 17 insertions, 19 deletions
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]), |