Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: freeze-exception

Hello,

There has been a recent new bugfix release of babeld that fixes a
possible crash on mips architectures. Attached is the diff of what I
am planning to upload against the current version in unstable (and
testing).

Can it be granted a freeze exception?


Cheers,

-- 
Stéphane

-- System Information:
Debian Release: squeeze/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-5-amd64 (SMP w/2 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff --git a/CHANGES b/CHANGES
index 8a138da..14fc816 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+1 October 2010: babeld 1.0.2:
+
+  * Worked around a gcc bug that would cause assertion failures on MIPS.
+
 2 May 2010: babeld 1.0.1:
 
   * Fixed a bug that could cause input filters to be ignored.
diff --git a/debian/changelog b/debian/changelog
index 56422c2..ec21adc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+babeld (1.0.2-1) UNRELEASED; urgency=low
+
+  * New upstream release
+
+ -- Stéphane Glondu <glo...@debian.org>  Sat, 16 Oct 2010 09:01:24 +0200
+
 babeld (1.0.1-1) unstable; urgency=low
 
   * New upstream release
diff --git a/route.c b/route.c
index b1a90db..3997af5 100644
--- a/route.c
+++ b/route.c
@@ -234,7 +234,7 @@ switch_routes(struct route *old, struct route *new)
     local_notify_route(new, LOCAL_CHANGE);
 }
 
-void
+static void
 change_route_metric(struct route *route, unsigned newmetric)
 {
     int old, new;
@@ -262,6 +262,13 @@ change_route_metric(struct route *route, unsigned newmetric)
     local_notify_route(route, LOCAL_CHANGE);
 }
 
+static void
+retract_route(struct route *route)
+{
+    route->refmetric = INFINITY;
+    change_route_metric(route, INFINITY);
+}
+
 int
 route_feasible(struct route *route)
 {
@@ -326,31 +333,30 @@ find_best_route(const unsigned char *prefix, unsigned char plen, int feasible,
 void
 update_route_metric(struct route *route)
 {
-    int oldmetric;
-    int newmetric;
+    int oldmetric = route_metric(route);
 
-    oldmetric = route_metric(route);
     if(route_expired(route)) {
         if(route->refmetric < INFINITY) {
             route->seqno = seqno_plus(route->src->seqno, 1);
-            route->refmetric = INFINITY;
+            retract_route(route);
+            if(oldmetric < INFINITY)
+                route_changed(route, route->src, oldmetric);
         }
-        newmetric = INFINITY;
     } else {
         struct neighbour *neigh = route->neigh;
         int add_metric = input_filter(route->src->id,
                                       route->src->prefix, route->src->plen,
                                       neigh->address,
                                       neigh->network->ifindex);
-        newmetric = MIN(route->refmetric +
-                        add_metric +
-                        neighbour_cost(route->neigh),
-                        INFINITY);
-    }
-
-    if(newmetric != oldmetric) {
-        change_route_metric(route, newmetric);
-        route_changed(route, route->src, oldmetric);
+        int newmetric = MIN(route->refmetric +
+                            add_metric +
+                            neighbour_cost(route->neigh),
+                            INFINITY);
+
+        if(newmetric != oldmetric) {
+            change_route_metric(route, newmetric);
+            route_changed(route, route->src, oldmetric);
+        }
     }
 }
 
@@ -572,10 +578,11 @@ retract_neighbour_routes(struct neighbour *neigh)
     i = 0;
     while(i < numroutes) {
         if(routes[i].neigh == neigh) {
-            unsigned short oldmetric = route_metric(&routes[i]);
-            if(oldmetric != INFINITY) {
-                change_route_metric(&routes[i], INFINITY);
-                route_changed(&routes[i], routes[i].src, oldmetric);
+            if(routes[i].refmetric != INFINITY) {
+                unsigned short oldmetric = route_metric(&routes[i]);
+                    retract_route(&routes[i]);
+                    if(oldmetric != INFINITY)
+                        route_changed(&routes[i], routes[i].src, oldmetric);
             }
         }
         i++;
diff --git a/route.h b/route.h
index 64fa3d2..72a1098 100644
--- a/route.h
+++ b/route.h
@@ -52,7 +52,6 @@ void flush_network_routes(struct network *net, int v4only);
 void install_route(struct route *route);
 void uninstall_route(struct route *route);
 void switch_route(struct route *old, struct route *new);
-void change_route_metric(struct route *route, unsigned newmetric);
 int route_feasible(struct route *route);
 int route_old(struct route *route);
 int route_expired(struct route *route);
diff --git a/util.h b/util.h
index 62abb2b..d142018 100644
--- a/util.h
+++ b/util.h
@@ -20,7 +20,15 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 
-#if defined __GNUC__
+#if defined(i386) || defined(__mc68020__) || defined(__x86_64__)
+#define DO_NTOHS(_d, _s) do { _d = ntohs(*(unsigned short*)(_s)); } while(0)
+#define DO_NTOHL(_d, _s) do { _d = ntohl(*(unsigned*)(_s)); } while(0)
+#define DO_HTONS(_d, _s) do { *(unsigned short*)(_d) = htons(_s); } while(0)
+#define DO_HTONL(_d, _s) do { *(unsigned*)(_d) = htonl(_s); } while(0)
+/* Some versions of gcc seem to be buggy, and ignore the packed attribute.
+   Disable this code until the issue is clarified. */
+/* #elif defined __GNUC__*/
+#elif 0
 struct __us { unsigned short x __attribute__((packed)); };
 #define DO_NTOHS(_d, _s) \
     do { _d = ntohs(((const struct __us*)(_s))->x); } while(0)

Reply via email to