summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ulogd_filter_HWHDR.c36
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]),