Index: uspace/srv/net/il/ip/ip.c
===================================================================
--- uspace/srv/net/il/ip/ip.c	(revision 768ea9efd548e409117c55f9278a127ac05e191a)
+++ uspace/srv/net/il/ip/ip.c	(revision fd8e8e1bdc24e6988dc181ca0cab34d17aac6da7)
@@ -652,6 +652,8 @@
 			middle_header = (ip_header_ref) packet_prefix(next,
 			    IP_HEADER_LENGTH(last_header));
-			if (!middle_header)
+			if (!middle_header) {
+				free(last_header);
 				return ENOMEM;
+			}
 
 			memcpy(middle_header, last_header,
@@ -667,8 +669,11 @@
 			    IP_HEADER_CHECKSUM(middle_header);
 			if (destination) {
-				ERROR_PROPAGATE(packet_set_addr(next, NULL,
+				if (ERROR_OCCURRED(packet_set_addr(next, NULL,
 				    (uint8_t *) destination->value,
 				    CONVERT_SIZE(char, uint8_t,
-				    destination->length)));
+				    destination->length)))) {
+				    	free(last_header);
+					return ERROR_CODE;
+				}
 			}
 			length += packet_get_data_length(next);
@@ -678,6 +683,8 @@
 		middle_header = (ip_header_ref) packet_prefix(next,
 		    IP_HEADER_LENGTH(last_header));
-		if (!middle_header)
+		if (!middle_header) {
+			free(last_header);
 			return ENOMEM;
+		}
 
 		memcpy(middle_header, last_header,
@@ -692,7 +699,11 @@
 		    IP_HEADER_CHECKSUM(middle_header);
 		if (destination) {
-			ERROR_PROPAGATE(packet_set_addr(next, NULL,
+			if (ERROR_OCCURRED(packet_set_addr(next, NULL,
 			    (uint8_t *) destination->value,
-			    CONVERT_SIZE(char, uint8_t, destination->length)));
+			    CONVERT_SIZE(char, uint8_t,
+			    destination->length)))) {
+				free(last_header);
+				return ERROR_CODE;
+			    }
 		}
 		length += packet_get_data_length(next);
