On Wed, 2 Feb 2011, Roberto C. Sánchez wrote:

What are your thoughts on the patch provided below by Ilya?

I'll have to check the rfc and do some tests, but it's probably good.

Paul

Regards,

-Roberto

On Wed, Feb 02, 2011 at 07:44:03PM +0300, ilya wrote:
Package: xl2tpd
Version: 1.2.7+dfsg-1
Severity: important

Now xl2tpd cut 2 bytes from incomming frame in LAC mode, if it has offset,
before send to pppd.
It is two bytes "FF 03" usually.

Patch for this mistake:
l2tp-offsetpad-error.patch:

--- xl2tpd-1.2.7+dfsg.orig/network.c
+++ xl2tpd-1.2.7+dfsg/network.c
@@ -153,7 +153,7 @@ inline void fix_hdr (void *buf)
     {
         int len = 6;
         if (PSBIT (ver))
-            len += 4;
+            len += 2;
         if (PLBIT (ver))
             len += 2;
         if (PFBIT (ver))
--- xl2tpd-1.2.7+dfsg.orig/control.c
+++ xl2tpd-1.2.7+dfsg/control.c
@@ -1299,7 +1299,7 @@ inline int check_payload (struct buffer
                        }
                } */
         if (PSBIT (h->ver))
-            ehlen += 4;         /* Offset information */
+            ehlen += 2;         /* Offset information */
         if (PLBIT (h->ver))
             ehlen += h->length; /* include length if available */
         if (PVER (h->ver) != VER_L2TP)
@@ -1365,7 +1365,7 @@ inline int expand_payload (struct buffer
     if (!PFBIT (h->ver))
         ehlen += 4;             /* Should have Ns and Nr too */
     if (!PSBIT (h->ver))
-        ehlen += 4;             /* Offset information */
+        ehlen += 2;             /* Offset information */
     if (ehlen)
     {
         /*
@@ -1410,13 +1410,13 @@ inline int expand_payload (struct buffer
         {
             r++;
             new_hdr->o_size = *r;
-            r++;
-            new_hdr->o_pad = *r;
+//            r++;
+//            new_hdr->o_pad = *r;
         }
         else
         {
             new_hdr->o_size = 0;
-            new_hdr->o_pad = 0;
+//            new_hdr->o_pad = 0;
         }
     }
     else
@@ -1548,8 +1548,9 @@ inline int write_packet (struct buffer *
     /*
      * Skip over header
      */
-    buf->start += sizeof (struct payload_hdr);
-    buf->len -= sizeof (struct payload_hdr);
+    _u16 offset = ((struct payload_hdr*)(buf->start))->o_size;  // For FIXME:
+    buf->start += sizeof(struct payload_hdr) + offset;
+    buf->len -= sizeof(struct payload_hdr) + offset;

     c->rx_pkts++;
     c->rx_bytes += buf->len;
--- xl2tpd-1.2.7+dfsg.orig/call.c
+++ xl2tpd-1.2.7+dfsg/call.c
@@ -52,8 +52,8 @@ void add_payload_hdr (struct tunnel *t,
     buf->start -= sizeof (struct payload_hdr);
     buf->len += sizeof (struct payload_hdr);
     /* Account for no offset */
-    buf->start += 4;
-    buf->len -= 4;
+    buf->start += 2;
+    buf->len -= 2;
     if (!c->fbit && !c->ourfbit)
     {
         /* Forget about Ns and Nr fields then */
--- xl2tpd-1.2.7+dfsg.orig/l2tp.h
+++ xl2tpd-1.2.7+dfsg/l2tp.h
@@ -82,7 +82,7 @@ struct payload_hdr
     _u16 Ns;                    /* Optional next sent */
     _u16 Nr;                    /* Optional next received */
     _u16 o_size;                /* Optional offset size */
-    _u16 o_pad;                 /* Optional offset padding */
+//    _u16 o_pad;                 /* Optional offset padding */
 } __attribute__((packed));

 #define NZL_TIMEOUT_DIVISOR 4   /* Divide TIMEOUT by this and



-- System Information:
Debian Release: 6.0
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-5-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.utf8, LC_CTYPE=en_US.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages xl2tpd depends on:
ii  libc6                         2.11.2-10  Embedded GNU C Library: Shared lib
ii  libpcap0.8                    1.1.1-2    system interface for user-level pa
ii  ppp                           2.4.5-4    Point-to-Point Protocol (PPP) - da

xl2tpd recommends no packages.

xl2tpd suggests no packages.

-- Configuration Files:
/etc/init.d/xl2tpd changed [not included]
/etc/xl2tpd/l2tp-secrets [Errno 13] Permission denied: 
u'/etc/xl2tpd/l2tp-secrets'
/etc/xl2tpd/xl2tpd.conf changed [not included]

-- no debconf information

--- xl2tpd-1.2.7+dfsg.orig/network.c
+++ xl2tpd-1.2.7+dfsg/network.c
@@ -153,7 +153,7 @@ inline void fix_hdr (void *buf)
     {
         int len = 6;
         if (PSBIT (ver))
-            len += 4;
+            len += 2;
         if (PLBIT (ver))
             len += 2;
         if (PFBIT (ver))
--- xl2tpd-1.2.7+dfsg.orig/control.c
+++ xl2tpd-1.2.7+dfsg/control.c
@@ -1299,7 +1299,7 @@ inline int check_payload (struct buffer
                        }
                } */
         if (PSBIT (h->ver))
-            ehlen += 4;         /* Offset information */
+            ehlen += 2;         /* Offset information */
         if (PLBIT (h->ver))
             ehlen += h->length; /* include length if available */
         if (PVER (h->ver) != VER_L2TP)
@@ -1365,7 +1365,7 @@ inline int expand_payload (struct buffer
     if (!PFBIT (h->ver))
         ehlen += 4;             /* Should have Ns and Nr too */
     if (!PSBIT (h->ver))
-        ehlen += 4;             /* Offset information */
+        ehlen += 2;             /* Offset information */
     if (ehlen)
     {
         /*
@@ -1410,13 +1410,13 @@ inline int expand_payload (struct buffer
         {
             r++;
             new_hdr->o_size = *r;
-            r++;
-            new_hdr->o_pad = *r;
+//            r++;
+//            new_hdr->o_pad = *r;
         }
         else
         {
             new_hdr->o_size = 0;
-            new_hdr->o_pad = 0;
+//            new_hdr->o_pad = 0;
         }
     }
     else
@@ -1548,8 +1548,9 @@ inline int write_packet (struct buffer *
     /*
      * Skip over header
      */
-    buf->start += sizeof (struct payload_hdr);
-    buf->len -= sizeof (struct payload_hdr);
+    _u16 offset = ((struct payload_hdr*)(buf->start))->o_size;  // For FIXME:
+    buf->start += sizeof(struct payload_hdr) + offset;
+    buf->len -= sizeof(struct payload_hdr) + offset;

     c->rx_pkts++;
     c->rx_bytes += buf->len;
--- xl2tpd-1.2.7+dfsg.orig/call.c
+++ xl2tpd-1.2.7+dfsg/call.c
@@ -52,8 +52,8 @@ void add_payload_hdr (struct tunnel *t,
     buf->start -= sizeof (struct payload_hdr);
     buf->len += sizeof (struct payload_hdr);
     /* Account for no offset */
-    buf->start += 4;
-    buf->len -= 4;
+    buf->start += 2;
+    buf->len -= 2;
     if (!c->fbit && !c->ourfbit)
     {
         /* Forget about Ns and Nr fields then */
--- xl2tpd-1.2.7+dfsg.orig/l2tp.h
+++ xl2tpd-1.2.7+dfsg/l2tp.h
@@ -82,7 +82,7 @@ struct payload_hdr
     _u16 Ns;                    /* Optional next sent */
     _u16 Nr;                    /* Optional next received */
     _u16 o_size;                /* Optional offset size */
-    _u16 o_pad;                 /* Optional offset padding */
+//    _u16 o_pad;                 /* Optional offset padding */
 } __attribute__((packed));

 #define NZL_TIMEOUT_DIVISOR 4   /* Divide TIMEOUT by this and


--
Roberto C. Sánchez
http://people.connexer.com/~roberto
http://www.connexer.com




--
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to