diff --git a/gtests/net/packetdrill/netdev.c b/gtests/net/packetdrill/netdev.c
index 64ac611ebdf2e86d545d2b41281cf5c755d38cd4..37399b2137f2ce188be5e7ee4b022503730ecc82 100644
--- a/gtests/net/packetdrill/netdev.c
+++ b/gtests/net/packetdrill/netdev.c
@@ -380,28 +380,31 @@ int netdev_receive_loop(struct packet_socket *psock,
 			char **error)
 {
 	assert(*packet == NULL);	/* should be no packet yet */
-	*packet = packet_new(PACKET_READ_BYTES);
 
 	while (1) {
 		int in_bytes = 0;
 		enum packet_parse_result_t result;
 
+		*packet = packet_new(PACKET_READ_BYTES);
+
 		/* Sniff the next outbound packet from the kernel under test. */
 		if (packet_socket_receive(psock, DIRECTION_OUTBOUND,
 					  *packet, &in_bytes))
 			continue;
 
 		result = parse_packet(*packet, in_bytes, layer, error);
-		if (result == PACKET_OK) {
+
+		if (result == PACKET_OK)
 			return STATUS_OK;
-		} else if (result == PACKET_BAD) {
-			packet_free(*packet);
-			*packet = NULL;
+
+		packet_free(*packet);
+		*packet = NULL;
+
+		if (result == PACKET_BAD)
 			return STATUS_ERR;
-		} else {
-			DEBUGP("parse_result:%d; error parsing packet: %s\n",
-			       result, *error);
-		}
+
+		DEBUGP("parse_result:%d; error parsing packet: %s\n",
+		       result, *error);
 	}
 
 	assert(!"should not be reached");