mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-08-05 08:10:15 +02:00
(is_zero_or_power_of_two): Renamed from
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.
This commit is contained in:
+14
-3
@@ -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
|
||||
@@ -39,8 +40,10 @@
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user