Move msgsize santity check into parser
authorHenning Rogge <hrogge@googlemail.com>
Thu, 8 Apr 2010 12:57:43 +0000 (14:57 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Thu, 8 Apr 2010 12:57:43 +0000 (14:57 +0200)
src/defs.h
src/hna_set.c
src/parser.c

index aa24d22..06bac96 100644 (file)
@@ -69,8 +69,6 @@ extern const char build_host[];
 #define UDP_IPV4_HDRSIZE        28
 #define UDP_IPV6_HDRSIZE        62
 
-#define MIN_PACKET_SIZE(ver)   ((int)(sizeof(uint8_t) * (((ver) == AF_INET) ? 4 : 7)))
-
 /* Debug helper macro */
 #ifdef DEBUG
 #define olsr_debug(lvl, format, args...) do {                           \
index b0c65d9..99548f7 100644 (file)
@@ -401,14 +401,6 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
   /* olsr_msgsize */
   pkt_get_u16(&curr, &olsr_msgsize);
 
-  if (olsr_msgsize < 8 + olsr_cnf->ipsize) {
-#ifndef WIN32
-    OLSR_PRINTF(1, "HNA message size %d too small (at least %zu)!\n", olsr_msgsize,
-                8 + olsr_cnf->ipsize);
-#endif
-    return false;
-  }
-
   hnasize = olsr_msgsize - 8 - olsr_cnf->ipsize;
   curr_end = (const uint8_t *)m + olsr_msgsize;
 
index 6d3a2ab..571d299 100644 (file)
@@ -273,15 +273,16 @@ void
 parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip_addr *from_addr)
 {
   union olsr_message *m = (union olsr_message *)olsr->olsr_msg;
-  int count;
-  int msgsize;
+  uint32_t count;
+  uint32_t msgsize;
   uint16_t seqno;
   struct parse_function_entry *entry;
   struct packetparser_function_entry *packetparser;
 
   count = size - ((char *)m - (char *)olsr);
 
-  if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
+  /* minimum packet size is 4 */
+  if (count < 4)
     return;
 
   if (ntohs(olsr->olsr_packlen) !=(uint16_t) size) {
@@ -324,7 +325,8 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
     bool forward = true;
     bool validated;
 
-    if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version) + 8)
+    /* minimum message size is 8 + ipsize */
+    if (count < 8 + olsr_cnf->ipsize)
       break;
 
     if (olsr_cnf->ip_version == AF_INET) {
@@ -336,15 +338,16 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
       seqno = ntohs(m->v6.seqno);
     }
 
-    if (msgsize == 0) {
+    /* sanity check for msgsize */
+    if (msgsize < 8 + olsr_cnf->ipsize) {
       struct ipaddr_str buf;
       union olsr_ip_addr *msgorig = (union olsr_ip_addr *) &m->v4.originator;
-      OLSR_PRINTF(1, "Error, OLSR message from %s (type %d) is zero lengthed"
+      OLSR_PRINTF(1, "Error, OLSR message from %s (type %d) is to small (%d bytes)"
           ", ignoring all further content of the packet\n",
-          olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype);
-      olsr_syslog(OLSR_LOG_ERR, "Error, OLSR message from %s (type %d) is zero"
-          "lengthed, ignoring all further content of the packet\n",
-          olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype);
+          olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize);
+      olsr_syslog(OLSR_LOG_ERR, "Error, OLSR message from %s (type %d) is too small (%d bytes)"
+          ", ignoring all further content of the packet\n",
+          olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize);
       break;
     }
 
@@ -374,15 +377,6 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
 
     count -= msgsize;
 
-    /* Check size of message */
-    if (count < 0) {
-      struct ipaddr_str buf;
-      OLSR_PRINTF(1, "packet length error in  packet received from %s!", olsr_ip_to_string(&buf, from_addr));
-
-      olsr_syslog(OLSR_LOG_ERR, " packet length error in  packet received from %s!", olsr_ip_to_string(&buf, from_addr));
-      break;
-    }
-
     /*RFC 3626 section 3.4:
      *  2    If the time to live of the message is less than or equal to
      *  '0' (zero), or if the message was sent by the receiving node