Reject invalid definitions of _POSIX_CHOWN_RESTRICTED, _POSIX_NO_TRUNC, _POSIX_VDISABLE

Message ID 87o9ld3lxz.fsf@linux-m68k.org
State Committed
Commit 9a1793289b08339660985cb2baada60debc70bf2
Headers

Commit Message

Andreas Schwab Jan. 28, 2018, 5:58 p.m. UTC
  POSIX requires that the constants _POSIX_CHOWN_RESTRICTED,
_POSIX_NO_TRUNC, and _POSIX_VDISABLE are always defined to a value other
than -1.

	* sysdeps/posix/fpathconf.c (__fpathconf): Verify the values of
	_POSIX_CHOWN_RESTRICTED, _POSIX_NO_TRUNC, _POSIX_VDISABLE.
	* sysdeps/posix/pathconf.c (__pathconf): Likewise.
---
 sysdeps/posix/fpathconf.c | 21 +++++++++------------
 sysdeps/posix/pathconf.c  | 21 +++++++++------------
 2 files changed, 18 insertions(+), 24 deletions(-)
  

Comments

Dmitry V. Levin Jan. 28, 2018, 10:50 p.m. UTC | #1
On Sun, Jan 28, 2018 at 06:58:00PM +0100, Andreas Schwab wrote:
> POSIX requires that the constants _POSIX_CHOWN_RESTRICTED,
> _POSIX_NO_TRUNC, and _POSIX_VDISABLE are always defined to a value other
> than -1.
> 
> 	* sysdeps/posix/fpathconf.c (__fpathconf): Verify the values of
> 	_POSIX_CHOWN_RESTRICTED, _POSIX_NO_TRUNC, _POSIX_VDISABLE.
> 	* sysdeps/posix/pathconf.c (__pathconf): Likewise.
> ---
>  sysdeps/posix/fpathconf.c | 21 +++++++++------------
>  sysdeps/posix/pathconf.c  | 21 +++++++++------------
>  2 files changed, 18 insertions(+), 24 deletions(-)
> 
> diff --git a/sysdeps/posix/fpathconf.c b/sysdeps/posix/fpathconf.c
> index 80af77e148..a9d164564e 100644
> --- a/sysdeps/posix/fpathconf.c
> +++ b/sysdeps/posix/fpathconf.c
> @@ -103,25 +103,22 @@ __fpathconf (int fd, int name)
>  #endif
>  
>      case _PC_CHOWN_RESTRICTED:
> -#ifdef	_POSIX_CHOWN_RESTRICTED
> -      return _POSIX_CHOWN_RESTRICTED;
> -#else
> -      return -1;
> +#if _POSIX_CHOWN_RESTRICTED == -1
> +# error "Invalid value for _POSIX_CHOWN_RESTRICTED"
>  #endif
> +      return _POSIX_CHOWN_RESTRICTED;
>  
>      case _PC_NO_TRUNC:
> -#ifdef	_POSIX_NO_TRUNC
> -      return _POSIX_NO_TRUNC;
> -#else
> -      return -1;
> +#if _POSIX_NO_TRUNC == -1
> +# error "Invalid value for _POSIX_NO_TRUNC"
>  #endif
> +      return _POSIX_NO_TRUNC;
>  
>      case _PC_VDISABLE:
> -#ifdef	_POSIX_VDISABLE
> -      return _POSIX_VDISABLE;
> -#else
> -      return -1;
> +#if _POSIX_VDISABLE == -1
> +# error "Invalid value for _POSIX_VDISABLE"
>  #endif
> +      return _POSIX_VDISABLE;

sysdeps/mach/hurd/bits/posix_opt.h defines _POSIX_VDISABLE
to ((unsigned char) -1), should it be fixed, too?
  
Samuel Thibault Jan. 28, 2018, 11:02 p.m. UTC | #2
Dmitry V. Levin, on lun. 29 janv. 2018 01:50:51 +0300, wrote:
> >      case _PC_VDISABLE:
> > -#ifdef	_POSIX_VDISABLE
> > -      return _POSIX_VDISABLE;
> > -#else
> > -      return -1;
> > +#if _POSIX_VDISABLE == -1
> > +# error "Invalid value for _POSIX_VDISABLE"
> >  #endif
> > +      return _POSIX_VDISABLE;
> 
> sysdeps/mach/hurd/bits/posix_opt.h defines _POSIX_VDISABLE
> to ((unsigned char) -1), should it be fixed, too?

Posix says that using -1 is invalid, indeed.

Samuel
  
Dmitry V. Levin Jan. 28, 2018, 11:27 p.m. UTC | #3
On Mon, Jan 29, 2018 at 12:02:13AM +0100, Samuel Thibault wrote:
> Dmitry V. Levin, on lun. 29 janv. 2018 01:50:51 +0300, wrote:
> > >      case _PC_VDISABLE:
> > > -#ifdef	_POSIX_VDISABLE
> > > -      return _POSIX_VDISABLE;
> > > -#else
> > > -      return -1;
> > > +#if _POSIX_VDISABLE == -1
> > > +# error "Invalid value for _POSIX_VDISABLE"
> > >  #endif
> > > +      return _POSIX_VDISABLE;
> > 
> > sysdeps/mach/hurd/bits/posix_opt.h defines _POSIX_VDISABLE
> > to ((unsigned char) -1), should it be fixed, too?
> 
> Posix says that using -1 is invalid, indeed.

As it's fixed now, the patch should be safe to commit.
  

Patch

diff --git a/sysdeps/posix/fpathconf.c b/sysdeps/posix/fpathconf.c
index 80af77e148..a9d164564e 100644
--- a/sysdeps/posix/fpathconf.c
+++ b/sysdeps/posix/fpathconf.c
@@ -103,25 +103,22 @@  __fpathconf (int fd, int name)
 #endif
 
     case _PC_CHOWN_RESTRICTED:
-#ifdef	_POSIX_CHOWN_RESTRICTED
-      return _POSIX_CHOWN_RESTRICTED;
-#else
-      return -1;
+#if _POSIX_CHOWN_RESTRICTED == -1
+# error "Invalid value for _POSIX_CHOWN_RESTRICTED"
 #endif
+      return _POSIX_CHOWN_RESTRICTED;
 
     case _PC_NO_TRUNC:
-#ifdef	_POSIX_NO_TRUNC
-      return _POSIX_NO_TRUNC;
-#else
-      return -1;
+#if _POSIX_NO_TRUNC == -1
+# error "Invalid value for _POSIX_NO_TRUNC"
 #endif
+      return _POSIX_NO_TRUNC;
 
     case _PC_VDISABLE:
-#ifdef	_POSIX_VDISABLE
-      return _POSIX_VDISABLE;
-#else
-      return -1;
+#if _POSIX_VDISABLE == -1
+# error "Invalid value for _POSIX_VDISABLE"
 #endif
+      return _POSIX_VDISABLE;
 
     case _PC_SYNC_IO:
 #ifdef	_POSIX_SYNC_IO
diff --git a/sysdeps/posix/pathconf.c b/sysdeps/posix/pathconf.c
index 2059e55b4f..0f893ec1ba 100644
--- a/sysdeps/posix/pathconf.c
+++ b/sysdeps/posix/pathconf.c
@@ -101,25 +101,22 @@  __pathconf (const char *path, int name)
 #endif
 
     case _PC_CHOWN_RESTRICTED:
-#ifdef	_POSIX_CHOWN_RESTRICTED
-      return _POSIX_CHOWN_RESTRICTED;
-#else
-      return -1;
+#if _POSIX_CHOWN_RESTRICTED == -1
+# error "Invalid value for _POSIX_CHOWN_RESTRICTED"
 #endif
+      return _POSIX_CHOWN_RESTRICTED;
 
     case _PC_NO_TRUNC:
-#ifdef	_POSIX_NO_TRUNC
-      return _POSIX_NO_TRUNC;
-#else
-      return -1;
+#if _POSIX_NO_TRUNC == -1
+# error "Invalid value for _POSIX_NO_TRUNC"
 #endif
+      return _POSIX_NO_TRUNC;
 
     case _PC_VDISABLE:
-#ifdef	_POSIX_VDISABLE
-      return _POSIX_VDISABLE;
-#else
-      return -1;
+#if _POSIX_VDISABLE == -1
+# error "Invalid value for _POSIX_VDISABLE"
 #endif
+      return _POSIX_VDISABLE;
 
     case _PC_SYNC_IO:
 #ifdef	_POSIX_SYNC_IO