Index: /trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 30352)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 30353)
@@ -1402,5 +1402,5 @@
             mr = m_getcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR);
             if (mr == NULL)
-                return;
+                break;
             reh = mtod(mr, struct ethhdr *);
             mr->m_data += ETH_HLEN;
@@ -1419,7 +1419,6 @@
                     || CTL_CHECK(htip, CTL_TFTP))
                     goto arp_ok;
-                m_freem(pData, m);
                 m_freem(pData, mr);
-                return;
+                break;
 
          arp_ok:
@@ -1445,4 +1444,7 @@
                 if_encap(pData, ETH_P_ARP, mr, ETH_ENCAP_URG);
             }
+            else
+                m_freem(pData, mr);
+
             /* Gratuitous ARP */
             if (  *(uint32_t *)ah->ar_sip == *(uint32_t *)ah->ar_tip
@@ -1453,21 +1455,10 @@
                  * Let's do ARP cache update
                  */
-                if (slirp_arp_cache_update(pData, *(uint32_t *)ah->ar_tip, &eh->h_dest[0]) == 0)
-                {
-                    m_freem(pData, m);
-                    break;
-                }
-                slirp_arp_cache_add(pData, *(uint32_t *)ah->ar_tip, &eh->h_dest[0]);
+                slirp_arp_cache_update_or_add(pData, *(uint32_t *)ah->ar_tip, &eh->h_dest[0]);
             }
             break;
 
         case ARPOP_REPLY:
-            if (slirp_arp_cache_update(pData, *(uint32_t *)ah->ar_sip, &ah->ar_sha[0]) == 0)
-            {
-                m_freem(pData, m);
-                break;
-            }
-            slirp_arp_cache_add(pData, *(uint32_t *)ah->ar_sip, ah->ar_sha);
-            m_freem(pData, m);
+            slirp_arp_cache_update_or_add(pData, *(uint32_t *)ah->ar_sip, &ah->ar_sha[0]);
             break;
 
@@ -1475,4 +1466,6 @@
             break;
     }
+
+    m_freem(pData, m);
 }
 
