If for some reason the file being scanned is malformed, or
overflows one of the feilds for some reason, scanf will neither
return EOF nor fill in all of its parameters correctly. In the
case that I observed this resulted in an endless loop.

This simple fix just bails out in this case.

Index: lha-STABLE_1_2-ipv6addr/heartbeat/resource.d/IPv6addr.c
===================================================================
--- lha-STABLE_1_2-ipv6addr.orig/heartbeat/resource.d/IPv6addr.c        
2007-04-19 12:43:15.000000000 +0900
+++ lha-STABLE_1_2-ipv6addr/heartbeat/resource.d/IPv6addr.c     2007-04-19 
13:31:58.000000000 +0900
@@ -378,16 +378,26 @@ find_if(struct in6_addr* addr_target, in
        }
 
        /* Loop for each entry */
-       while ( fscanf(f,"%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
-                       addr6p[0], addr6p[1], addr6p[2], addr6p[3],
-                       addr6p[4], addr6p[5], addr6p[6], addr6p[7],
-                       &if_idx, &plen, &scope, &dad_status, devname) != EOF){
-
+       while (1) {
                int             i;
                int             n;
                int             s;
                gboolean        same = TRUE;
 
+               i = fscanf(f,
+                      "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
+                      addr6p[0], addr6p[1], addr6p[2], addr6p[3],
+                              addr6p[4], addr6p[5], addr6p[6], addr6p[7],
+                      &if_idx, &plen, &scope, &dad_status, devname);
+               if (i == EOF) {
+                       break;
+               }
+               else if (i != 13) {
+                       cl_log(LOG_INFO, "Error parsing %s, "
+                              "perhaps the format has changed\n", IF_INET6);
+                       break;
+               }
+
                sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
                        addr6p[0], addr6p[1], addr6p[2], addr6p[3],
                        addr6p[4], addr6p[5], addr6p[6], addr6p[7]);

-- 

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/

_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to