diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2004-10-04 04:24:47 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2004-10-04 04:24:47 +0000 |
commit | 60c5990dc466c0b9fc5a10bc133d6970c5bd9152 (patch) | |
tree | d56e99b6a7cdf613ebf0ea1b668eb3c4c61b7aaf /lib | |
parent | c60d1bf2a758b6496f8647d28db766d78f6ada02 (diff) | |
download | gnulib-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.c | 11 |
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: |