Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Oct 2020 09:53:26 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Xin LI <delphij@freebsd.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r366781 - in head: include lib/libc/stdlib
Message-ID:  <20201017065326.GY2643@kib.kiev.ua>
In-Reply-To: <202010170414.09H4EdBF097521@repo.freebsd.org>
References:  <202010170414.09H4EdBF097521@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Oct 17, 2020 at 04:14:39AM +0000, Xin LI wrote:
> Author: delphij
> Date: Sat Oct 17 04:14:38 2020
> New Revision: 366781
> URL: https://svnweb.freebsd.org/changeset/base/366781
> 
> Log:
>   Implement ptsname_r.
>   
>   MFC after:	2 weeks
>   PR:		250062
>   Reviewed by:	jilles, 0mp, Ray <i maskray me>
>   Differential Revision:	https://reviews.freebsd.org/D26647
> 
> Modified:
>   head/include/stdlib.h
>   head/lib/libc/stdlib/Makefile.inc
>   head/lib/libc/stdlib/Symbol.map
>   head/lib/libc/stdlib/ptsname.3
>   head/lib/libc/stdlib/ptsname.c
> 
> Modified: head/include/stdlib.h
> ==============================================================================
> --- head/include/stdlib.h	Sat Oct 17 01:06:04 2020	(r366780)
> +++ head/include/stdlib.h	Sat Oct 17 04:14:38 2020	(r366781)
> @@ -225,6 +225,7 @@ long	 mrand48(void);
>  long	 nrand48(unsigned short[3]);
>  int	 posix_openpt(int);
>  char	*ptsname(int);
> +int	 ptsname_r(int, char *, size_t);
This declaration appears in the __XSI_VISIBLE block, but I do not see the
function description in the IEEE Std 1003.1™-2017 text (base issue 7).

Review mentioned that the function is scheduled for issue 8, but shouldn't
it put under BSD_VISIBLE until specification is finalized ?

>  int	 putenv(char *);
>  long	 random(void);
>  unsigned short
> 
> Modified: head/lib/libc/stdlib/Makefile.inc
> ==============================================================================
> --- head/lib/libc/stdlib/Makefile.inc	Sat Oct 17 01:06:04 2020	(r366780)
> +++ head/lib/libc/stdlib/Makefile.inc	Sat Oct 17 04:14:38 2020	(r366781)
> @@ -50,7 +50,7 @@ MLINKS+=hcreate.3 hdestroy.3 hcreate.3 hsearch.3
>  MLINKS+=hcreate.3 hcreate_r.3 hcreate.3 hdestroy_r.3 hcreate.3 hsearch_r.3
>  MLINKS+=insque.3 remque.3
>  MLINKS+=lsearch.3 lfind.3
> -MLINKS+=ptsname.3 grantpt.3 ptsname.3 unlockpt.3
> +MLINKS+=ptsname.3 grantpt.3 ptsname.3 ptsname_r.3 ptsname.3 unlockpt.3
>  MLINKS+=qsort.3 heapsort.3 qsort.3 mergesort.3 qsort.3 qsort_r.3 \
>  	qsort.3 qsort_s.3
>  MLINKS+=rand.3 rand_r.3 rand.3 srand.3
> 
> Modified: head/lib/libc/stdlib/Symbol.map
> ==============================================================================
> --- head/lib/libc/stdlib/Symbol.map	Sat Oct 17 01:06:04 2020	(r366780)
> +++ head/lib/libc/stdlib/Symbol.map	Sat Oct 17 04:14:38 2020	(r366781)
> @@ -125,6 +125,7 @@ FBSD_1.6 {
>  	qsort_s;
>  	rand;
>  	srand;
> +	ptsname_r;
This is unsorted now.

>  };
>  
>  FBSDprivate_1.0 {
> 
> Modified: head/lib/libc/stdlib/ptsname.3
> ==============================================================================
> --- head/lib/libc/stdlib/ptsname.3	Sat Oct 17 01:06:04 2020	(r366780)
> +++ head/lib/libc/stdlib/ptsname.3	Sat Oct 17 04:14:38 2020	(r366781)
> @@ -31,12 +31,13 @@
>  .\"
>  .\" $FreeBSD$
>  .\"
> -.Dd August 20, 2008
> +.Dd October 17, 2020
>  .Dt PTSNAME 3
>  .Os
>  .Sh NAME
>  .Nm grantpt ,
>  .Nm ptsname ,
> +.Nm ptsname_r ,
>  .Nm unlockpt
>  .Nd pseudo-terminal access functions
>  .Sh LIBRARY
> @@ -47,6 +48,8 @@
>  .Fn grantpt "int fildes"
>  .Ft "char *"
>  .Fn ptsname "int fildes"
> +.Ft "int"
> +.Fn ptsname_r "int fildes" "char *buffer" "size_t buflen"
>  .Ft int
>  .Fn unlockpt "int fildes"
>  .Sh DESCRIPTION
> @@ -87,12 +90,23 @@ and
>  have been called.
>  .Pp
>  The
> +.Fn ptsname_r
> +function is the thread-safe version of
> +.Fn ptsname .
> +The caller must provide storage for the results of the full pathname of
> +the slave device in the
> +.Fa buffer
> +and
> +.Fa bufsize
> +arguments.
> +.Pp
> +The
>  .Fn unlockpt
>  function clears the lock held on the pseudo-terminal pair
>  for the master device specified with
>  .Fa fildes .
>  .Sh RETURN VALUES
> -.Rv -std grantpt unlockpt
> +.Rv -std grantpt ptsname_r unlockpt
>  .Pp
>  The
>  .Fn ptsname
> @@ -103,7 +117,8 @@ pointer is returned.
>  .Sh ERRORS
>  The
>  .Fn grantpt ,
> -.Fn ptsname
> +.Fn ptsname ,
> +.Fn ptsname_r
>  and
>  .Fn unlockpt
>  functions may fail and set
> @@ -116,6 +131,16 @@ is not a valid open file descriptor.
>  .It Bq Er EINVAL
>  .Fa fildes
>  is not a master pseudo-terminal device.
> +.El
> +.Pp
> +In addition, the
> +.Fn ptsname_r
> +function may set
> +.Va errno
> +to:
> +.Bl -tag -width Er
> +.It Bq Er ERANGE
> +The buffer was too small.
>  .El
>  .Pp
>  In addition, the
> 
> Modified: head/lib/libc/stdlib/ptsname.c
> ==============================================================================
> --- head/lib/libc/stdlib/ptsname.c	Sat Oct 17 01:06:04 2020	(r366780)
> +++ head/lib/libc/stdlib/ptsname.c	Sat Oct 17 04:14:38 2020	(r366781)
> @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
>  #include <errno.h>
>  #include <paths.h>
>  #include <stdlib.h>
> +#include <string.h>
>  #include "un-namespace.h"
>  
>  /*
> @@ -71,23 +72,46 @@ __strong_reference(__isptmaster, grantpt);
>  __strong_reference(__isptmaster, unlockpt);
>  
>  /*
> - * ptsname():  return the pathname of the slave pseudo-terminal device
> - *             associated with the specified master.
> + * ptsname_r(): return the pathname of the slave pseudo-terminal device
> + *              associated with the specified master.
>   */
> -char *
> -ptsname(int fildes)
> +int
> +ptsname_r(int fildes, char *buffer, size_t buflen)
>  {
> -	static char pt_slave[sizeof _PATH_DEV + SPECNAMELEN] = _PATH_DEV;
> -	char *ret = NULL;
>  
> +	if (buflen <= sizeof(_PATH_DEV)) {
> +		errno = ERANGE;
> +		return (-1);
> +	}
> +
>  	/* Make sure fildes points to a master device. */
>  	if (__isptmaster(fildes) != 0)
> -		goto done;
> +		return (-1);
>  
> -	if (fdevname_r(fildes, pt_slave + (sizeof _PATH_DEV - 1),
> -	    sizeof pt_slave - (sizeof _PATH_DEV - 1)) != NULL)
> -		ret = pt_slave;
> +	memcpy(buffer, _PATH_DEV, sizeof(_PATH_DEV));
> +	buffer += sizeof(_PATH_DEV) - 1;
> +	buflen -= sizeof(_PATH_DEV) - 1;
>  
> -done:
> -	return (ret);
> +	if (fdevname_r(fildes, buffer, buflen) == NULL) {
> +		if (errno == EINVAL)
> +			errno = ERANGE;
> +		return (-1);
> +	}
> +
> +	return (0);
> +}
> +
> +/*
> + * ptsname():  return the pathname of the slave pseudo-terminal device
> + *             associated with the specified master.
> + */
> +char *
> +ptsname(int fildes)
> +{
> +	static char pt_slave[sizeof _PATH_DEV + SPECNAMELEN];
We usually write sizeof(_PATH_DEV).

> +
> +	if (ptsname_r(fildes, pt_slave, sizeof(pt_slave)) == 0)
Since ptsname_r is non-standard and exported, userspace is allowed to
interpose the symbol, which would break ptsname().

> +		return (pt_slave);
> +	else
'else' is redundand.

> +		return (NULL);
>  }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20201017065326.GY2643>