]> The Tcpdump Group git mirrors - tcpdump/commitdiff
PPP: When un-escaping, don't allocate a too-large buffer.
authorGuy Harris <[email protected]>
Sat, 18 Apr 2020 21:04:59 +0000 (14:04 -0700)
committerFrancois-Xavier Le Bail <[email protected]>
Mon, 20 Apr 2020 12:41:05 +0000 (14:41 +0200)
The buffer should be big enough to hold the captured data, but it
doesn't need to be big enough to hold the entire on-the-network packet,
if we haven't captured all of it.

(backported from commit e4add0b010ed6f2180dcb05a13026242ed935334)

print-ppp.c

index 891761728bbb7450368c7b838e8a82c1d7c681bd..33fb03412756cc14fe3f774981eaa31b9266e81f 100644 (file)
@@ -1367,19 +1367,29 @@ trunc:
        return 0;
 }
 
+/*
+ * Un-escape RFC 1662 PPP in HDLC-like framing, with octet escapes.
+ * The length argument is the on-the-wire length, not the captured
+ * length; we can only un-escape the captured part.
+ */
 static void
 ppp_hdlc(netdissect_options *ndo,
          const u_char *p, int length)
 {
+       u_int caplen = ndo->ndo_snapend - p;
        u_char *b, *t, c;
        const u_char *s;
-       int i, proto;
+       u_int i;
+       int proto;
        const void *se;
 
+       if (caplen == 0)
+               return;
+
         if (length <= 0)
                 return;
 
-       b = (u_char *)malloc(length);
+       b = (u_char *)malloc(caplen);
        if (b == NULL)
                return;
 
@@ -1388,10 +1398,10 @@ ppp_hdlc(netdissect_options *ndo,
         * Do this so that we dont overwrite the original packet
         * contents.
         */
-       for (s = p, t = b, i = length; i > 0 && ND_TTEST(*s); i--) {
+       for (s = p, t = b, i = caplen; i != 0; i--) {
                c = *s++;
                if (c == 0x7d) {
-                       if (i <= 1 || !ND_TTEST(*s))
+                       if (i <= 1)
                                break;
                        i--;
                        c = *s++ ^ 0x20;