diff --git a/src/cmdu.c b/src/cmdu.c
index c01d7de7488d4e094bc74eba69d6fb4e12b54895..f0f7691169e7f1e57bda0f8e442e27b8800ad5dd 100644
--- a/src/cmdu.c
+++ b/src/cmdu.c
@@ -607,8 +607,14 @@ int cmdu_parse_tlv_single(struct cmdu_buff *c, struct tlv *tv[],
 	}
 
 	/* malformed cmdu if data remaining */
-	if (len)
-		return -1;
+	if (len) {
+		int k = 0;
+
+		while (k < len) {
+			if (c->data[c->datalen - len + k++] != 0)
+				return -1;
+		}
+	}
 
 	/* exactly one tlv must be present */
 	if (policy->present == TLV_PRESENT_ONE && !tv[0])
@@ -661,9 +667,15 @@ int cmdu_parse_tlvs(struct cmdu_buff *c, struct tlv *tv[][16],
 		}
 	}
 
-	/* malformed cmdu if data remaining */
-	if (len)
-		return -1;
+	/* malformed cmdu if data remaining; only allow zero padding */
+	if (len) {
+		int k = 0;
+
+		while (k < len) {
+			if (c->data[c->datalen - len + k++] != 0)
+				return -1;
+		}
+	}
 
 	/* strictly check against tlv policies */
 	for (i = 0; i < policy_len; i++) {