struct uac_clock_multiplier_descriptor v3;
 };
 
+/* check whether the descriptor bLength has the minimal length */
+#define DESC_LENGTH_CHECK(p, proto) \
+       ((proto) == UAC_VERSION_3 ? \
+        ((p)->v3.bLength >= sizeof((p)->v3)) : \
+        ((p)->v2.bLength >= sizeof((p)->v2)))
+
 #define GET_VAL(p, proto, field) \
        ((proto) == UAC_VERSION_3 ? (p)->v3.field : (p)->v2.field)
 
 {
        union uac23_clock_source_desc *cs = p;
 
+       if (!DESC_LENGTH_CHECK(cs, proto))
+               return false;
        return GET_VAL(cs, proto, bClockID) == id;
 }
 
 {
        union uac23_clock_selector_desc *cs = p;
 
-       return GET_VAL(cs, proto, bClockID) == id;
+       if (!DESC_LENGTH_CHECK(cs, proto))
+               return false;
+       if (GET_VAL(cs, proto, bClockID) != id)
+               return false;
+       /* additional length check for baCSourceID array (in bNrInPins size)
+        * and two more fields (which sizes depend on the protocol)
+        */
+       if (proto == UAC_VERSION_3)
+               return cs->v3.bLength >= sizeof(cs->v3) + cs->v3.bNrInPins +
+                       4 /* bmControls */ + 2 /* wCSelectorDescrStr */;
+       else
+               return cs->v2.bLength >= sizeof(cs->v2) + cs->v2.bNrInPins +
+                       1 /* bmControls */ + 1 /* iClockSelector */;
 }
 
 static bool validate_clock_multiplier(void *p, int id, int proto)
 {
        union uac23_clock_multiplier_desc *cs = p;
 
+       if (!DESC_LENGTH_CHECK(cs, proto))
+               return false;
        return GET_VAL(cs, proto, bClockID) == id;
 }