changeset 2111:2f2084f21cfe

(mode_compile): Use uintmax_t, not unsigned long, to parse numeric modes. Check for any unknown bits, not just unknown bits left of the leftmost known bit.
author Jim Meyering <jim@meyering.net>
date Wed, 12 Jan 2000 06:49:59 +0000
parents bbdd9fc842fc
children 9b5fc18f4655
files lib/modechange.c
diffstat 1 files changed, 4 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lib/modechange.c
+++ b/lib/modechange.c
@@ -1,5 +1,5 @@
 /* modechange.c -- file mode manipulation
-   Copyright (C) 1989, 1990, 1997, 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1989, 1990, 1997-2000 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
@@ -157,7 +157,7 @@
 {
   struct mode_change *head;	/* First element of the linked list. */
   struct mode_change *tail;	/* An element of the linked list. */
-  unsigned long mode_value;	/* The mode value, if octal.  */
+  uintmax_t mode_value;		/* The mode value, if octal.  */
   char *string_end;		/* Pointer to end of parsed value.  */
   mode_t umask_value;		/* The umask value (surprise). */
 
@@ -166,10 +166,10 @@
   tail = NULL;
 #endif
 
-  if (xstrtoul (mode_string, &string_end, 8, &mode_value, "") == LONGINT_OK)
+  if (xstrtoumax (mode_string, &string_end, 8, &mode_value, "") == LONGINT_OK)
     {
       struct mode_change *p;
-      if (mode_value > CHMOD_MODE_BITS)
+      if (mode_value != (mode_value & CHMOD_MODE_BITS))
 	return MODE_INVALID;
       p = make_node_op_equals ((mode_t) mode_value);
       if (p == NULL)