Harden capability parsing
authorHardening <rdp.effort@gmail.com>
Fri, 13 Dec 2013 14:08:43 +0000 (15:08 +0100)
committerHardening <rdp.effort@gmail.com>
Fri, 13 Dec 2013 14:08:43 +0000 (15:08 +0100)
Don't check only the number of capabilities but also the remaining size in the stream

libfreerdp/core/capabilities.c

index 4da3396..5abb758 100644 (file)
@@ -3156,7 +3156,7 @@ BOOL rdp_read_capability_sets(wStream* s, rdpSettings* settings, UINT16 numberCa
        Stream_GetPointer(s, mark);
        count = numberCapabilities;
 
-       while (numberCapabilities > 0)
+       while (numberCapabilities > 0 && Stream_GetRemainingLength(s) >= 4)
        {
                Stream_GetPointer(s, bm);
 
@@ -3340,6 +3340,11 @@ BOOL rdp_read_capability_sets(wStream* s, rdpSettings* settings, UINT16 numberCa
        rdp_print_capability_sets(s, numberCapabilities, TRUE);
        Stream_SetPointer(s, em);
 #endif
+       if (numberCapabilities)
+       {
+               fprintf(stderr, "%s: strange we haven't read the number of announced capacity sets, read=%d expected=%d\n",
+                               __FUNCTION__, count-numberCapabilities, count);
+       }
 
        return TRUE;
 }