diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index 2ac18511e9..f99d18f4da 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -379,9 +379,14 @@ virNWFilterPoolObjRemove(virNWFilterPoolObjListPtr pools,
     }
 }
 
+union data {
+    void *v;
+    char *c;
+    unsigned char *uc;
+    unsigned int ui;
+};
 
-
-typedef bool (*valueValidator)(enum attrDatatype datatype, void *valptr,
+typedef bool (*valueValidator)(enum attrDatatype datatype, union data *valptr,
                                virNWFilterRuleDefPtr nwf);
 typedef bool (*valueFormatter)(virBufferPtr buf,
                                virNWFilterRuleDefPtr nwf);
@@ -407,18 +412,18 @@ static const struct int_map macProtoMap[] = {
 
 
 static bool
-checkMacProtocolID(enum attrDatatype datatype, void *value,
+checkMacProtocolID(enum attrDatatype datatype, union data *value,
                    virNWFilterRuleDefPtr nwf ATTRIBUTE_UNUSED)
 {
     int32_t res = -1;
 
     if (datatype == DATATYPE_STRING) {
-        if (intMapGetByString(macProtoMap, (char *)value, 1, &res) == 0)
+        if (intMapGetByString(macProtoMap, value->c, 1, &res) == 0)
             res = -1;
         datatype = DATATYPE_UINT16;
     } else if (datatype == DATATYPE_UINT16 ||
                datatype == DATATYPE_UINT16_HEX) {
-        res = (uint32_t)*(uint16_t *)value;
+        res = value->ui;
         if (res < 0x600)
             res = -1;
     }
@@ -485,10 +490,10 @@ checkValidMask(unsigned char *data, int len)
 
 static bool
 checkMACMask(enum attrDatatype datatype ATTRIBUTE_UNUSED,
-             void *macMask,
+             union data *macMask,
              virNWFilterRuleDefPtr nwf ATTRIBUTE_UNUSED)
 {
-    return checkValidMask((unsigned char *)macMask, 6);
+    return checkValidMask(macMask->uc, 6);
 }
 
 
@@ -511,18 +516,18 @@ static const struct int_map arpOpcodeMap[] = {
 
 static bool
 arpOpcodeValidator(enum attrDatatype datatype,
-                   void *value,
+                   union data *value,
                    virNWFilterRuleDefPtr nwf)
 {
     int32_t res = -1;
 
     if (datatype == DATATYPE_STRING) {
-        if (intMapGetByString(arpOpcodeMap, (char *)value, 1, &res) == 0)
+        if (intMapGetByString(arpOpcodeMap, value->c, 1, &res) == 0)
             res = -1;
         datatype = DATATYPE_UINT16;
     } else if (datatype == DATATYPE_UINT16 ||
                datatype == DATATYPE_UINT16_HEX) {
-        res = (uint32_t)*(uint16_t *)value;
+        res = (uint32_t)value->ui;
     }
 
     if (res != -1) {
@@ -570,18 +575,18 @@ static const struct int_map ipProtoMap[] = {
 
 
 static bool checkIPProtocolID(enum attrDatatype datatype,
-                              void *value,
+                              union data *value,
                               virNWFilterRuleDefPtr nwf)
 {
     int32_t res = -1;
 
     if (datatype == DATATYPE_STRING) {
-        if (intMapGetByString(ipProtoMap, (char *)value, 1, &res) == 0)
+        if (intMapGetByString(ipProtoMap, value->c, 1, &res) == 0)
             res = -1;
         datatype = DATATYPE_UINT8_HEX;
     } else if (datatype == DATATYPE_UINT8 ||
                datatype == DATATYPE_UINT8_HEX) {
-        res = (uint32_t)*(uint16_t *)value;
+        res = (uint32_t)value->ui;
     }
 
     if (res != -1) {
@@ -615,10 +620,10 @@ formatIPProtocolID(virBufferPtr buf,
 
 
 static bool
-dscpValidator(enum attrDatatype datatype, void *val,
+dscpValidator(enum attrDatatype datatype, union data *val,
               virNWFilterRuleDefPtr nwf)
 {
-    uint8_t dscp = *(uint16_t *)val;
+    uint8_t dscp = val->ui;
     if (dscp > 63)
         return 0;
 
@@ -1150,7 +1155,8 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
     nwItemDesc *item;
     int int_val;
     unsigned int uint_val;
-    void *data_ptr = NULL, *storage_ptr;
+    void *storage_ptr;
+    union data data;
     valueValidator validator;
     char *match = virXMLPropString(node, "match");
     nwIPAddress ipaddr;
@@ -1206,7 +1212,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                                 if (uint_val <= 0xff) {
                                     *(uint8_t *)storage_ptr = uint_val;
                                     found = 1;
-                                    data_ptr = &uint_val;
+                                    data.ui = uint_val;
                                 } else
                                     rc = -1;
                             } else
@@ -1221,7 +1227,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                                 if (uint_val <= 0xffff) {
                                     *(uint16_t *)storage_ptr = uint_val;
                                     found = 1;
-                                    data_ptr = &uint_val;
+                                    data.ui = uint_val;
                                 } else
                                     rc = -1;
                             } else
@@ -1245,7 +1251,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                                         *(uint8_t *)storage_ptr =
                                                (uint8_t)uint_val;
                                     found = 1;
-                                    data_ptr = &uint_val;
+                                    data.ui = uint_val;
                                 } else
                                     rc = -1;
                             } else {
@@ -1278,7 +1284,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                                         (nwMACAddressPtr)storage_ptr)) {
                                 rc = -1;
                             }
-                            data_ptr = storage_ptr;
+                            data.v = storage_ptr;
                             found = 1;
                         break;
 
@@ -1299,7 +1305,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                                         *(uint8_t *)storage_ptr =
                                                (uint8_t)uint_val;
                                     found = 1;
-                                    data_ptr = &uint_val;
+                                    data.ui = uint_val;
                                 } else
                                     rc = -1;
                             } else {
@@ -1322,7 +1328,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                                 rc = -1;
                                 break;
                             }
-                            data_ptr = prop;
+                            data.c = prop;
                             found = 1;
                         break;
 
@@ -1344,7 +1350,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr node,
                 *flags = NWFILTER_ENTRY_ITEM_FLAG_EXISTS | flags_set;
                 item->datatype = datatype >> 1;
                 if (validator) {
-                    if (!validator(datatype >> 1, data_ptr, nwf)) {
+                    if (!validator(datatype >> 1, &data, nwf)) {
                         rc = -1;
                         *flags = 0;
                     }