]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
(is_zero_or_power_of_two): Renamed from
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 28 Jul 2004 00:30:45 +0000 (00:30 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 28 Jul 2004 00:30:45 +0000 (00:30 +0000)
is_power_of_two, to reflect better what it really does.
All uses changed.  Arg is now uintmax_t, not unsigned int
(it should have been unsigned long int -- that was a bug).
(cycle_check): Check for integer overflow in cycle count,
and report a cycle if that happens, as it must be a cycle
by this point.

lib/cycle-check.c

index 8c7463b2f8338673dce5e70c356a6f1f5ee4463b..99a88c35e24c9428eff3ec72ba4747f6c03a8392 100644 (file)
@@ -1,5 +1,6 @@
 /* help detect directory cycles efficiently
-   Copyright 2003 Free Software Foundation, Inc.
+
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #define CC_MAGIC 9827862
 
+/* Return true if I is a power of 2, or is zero.  */
+
 static inline bool
-is_power_of_two (unsigned int i)
+is_zero_or_power_of_two (uintmax_t i)
 {
   return (i & (i - 1)) == 0;
 }
@@ -73,8 +76,16 @@ cycle_check (struct cycle_check_state *state, struct stat const *sb)
 
   /* If the number of `descending' chdir calls is a power of two,
      record the dev/ino of the current directory.  */
-  if (is_power_of_two (++(state->chdir_counter)))
+  if (is_zero_or_power_of_two (++(state->chdir_counter)))
     {
+      /* On all architectures that we know about, if the counter
+        overflows then there is a directory cycle here somewhere,
+        even if we haven't detected it yet.  Typically this happens
+        only after the counter is incremented 2**64 times, so it's a
+        fairly theoretical point.  */
+      if (state->chdir_counter == 0)
+       return true;
+
       state->dev_ino.st_dev = sb->st_dev;
       state->dev_ino.st_ino = sb->st_ino;
     }