Fix new_seqno()'s recovery from seqno mismatch
authorMarkus Armbruster <armbru@pond.sub.org>
Thu, 31 Dec 2009 11:12:39 +0000 (12:12 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Tue, 19 Jan 2010 07:26:39 +0000 (08:26 +0100)
A sequence number mismatch occurs when an invalid copy (with a stale
sequence number) gets written.  To continue after the error, we need
to use the current sequence number.  But new_seqno() used the larger
one of the two, which is correct only as long as sequence numbers do
not overflow.  Overflow is rather unlikely, though.

src/lib/common/file.c

index af02cf1842024120e8d3f4a3279e126522061fb6..f32bafa4bb61e67d49f15ef9d7353b911a022540 100644 (file)
@@ -603,8 +603,7 @@ new_seqno(struct empfile *ep, void *buf)
     if (!(ep->flags & EFF_TYPED))
        return;
     old_seqno = get_seqno(ep, elt->uid);
-    if (CANT_HAPPEN(old_seqno != elt->seqno))
-       old_seqno = MAX(old_seqno, elt->seqno);
+    CANT_HAPPEN(old_seqno != elt->seqno);
     elt->seqno = old_seqno + 1;
 }