summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2004-10-04 04:24:47 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2004-10-04 04:24:47 +0000
commit60c5990dc466c0b9fc5a10bc133d6970c5bd9152 (patch)
treed56e99b6a7cdf613ebf0ea1b668eb3c4c61b7aaf /lib
parentc60d1bf2a758b6496f8647d28db766d78f6ada02 (diff)
downloadgnulib-60c5990dc466c0b9fc5a10bc133d6970c5bd9152.tar.gz
(mode_compile): Don't decrement a pointer that
points to the start of a string, as the C Standard says the resulting behavior is undefined.
Diffstat (limited to 'lib')
-rw-r--r--lib/modechange.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/modechange.c b/lib/modechange.c
index b4df3388ce..991235b09c 100644
--- a/lib/modechange.c
+++ b/lib/modechange.c
@@ -211,10 +211,9 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
umask_value = umask (0);
umask (umask_value); /* Restore the old value. */
- --mode_string;
/* One loop iteration for each "ugoa...=+-rwxXstugo...[=+-rwxXstugo...]". */
- do
+ for (;; mode_string++)
{
/* Which bits in the mode are operated on. */
mode_t affected_bits = 0;
@@ -226,7 +225,7 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
bool who_specified_p;
/* Turn on all the bits in `affected_bits' for each group given. */
- for (++mode_string;; ++mode_string)
+ for (;; mode_string++)
switch (*mode_string)
{
case 'u':
@@ -349,7 +348,11 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
}
no_more_values:;
}
- } while (*mode_string == ',');
+
+ if (*mode_string != ',')
+ break;
+ }
+
if (*mode_string == 0)
return head;
invalid: