From 5011fb430a898f8ef4f53f4ae2034d029cd388c0 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Tue, 20 Oct 2020 01:29:45 +0000 Subject: [PATCH] Further refinements of ptsname_r(3) interface: - Hide ptsname_r under __BSD_VISIBLE for now as the specification is not finalized at this time. - Keep Symbol.map sorted. - Avoid the interposing of ptsname_r(3) from an user application from breaking ptsname(3) by making the implementation a static method and call the static function from ptsname(3) instead. Reported by: kib Reviewed by: kib, jilles MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D26845 --- include/stdlib.h | 14 ++++++++++---- lib/libc/stdlib/Symbol.map | 2 +- lib/libc/stdlib/ptsname.c | 12 +++++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/stdlib.h b/include/stdlib.h index b09517751e8d..045a9fda9cfb 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -211,7 +211,6 @@ double drand48(void); double erand48(unsigned short[3]); /* char *fcvt(double, int, int * __restrict, int * __restrict); */ /* char *gcvt(double, int, int * __restrict, int * __restrict); */ -int grantpt(int); char *initstate(unsigned int, char *, size_t); long jrand48(unsigned short[3]); char *l64a(long); @@ -223,9 +222,6 @@ char *mktemp(char *); #endif long mrand48(void); long nrand48(unsigned short[3]); -int posix_openpt(int); -char *ptsname(int); -int ptsname_r(int, char *, size_t); int putenv(char *); long random(void); unsigned short @@ -233,8 +229,18 @@ unsigned short char *setstate(/* const */ char *); void srand48(long); void srandom(unsigned int); +#endif /* __XSI_VISIBLE */ + +#if __XSI_VISIBLE +int grantpt(int); +int posix_openpt(int); +char *ptsname(int); int unlockpt(int); #endif /* __XSI_VISIBLE */ +#if __BSD_VISIBLE +/* ptsname_r will be included in POSIX issue 8 */ +int ptsname_r(int, char *, size_t); +#endif #if __BSD_VISIBLE extern const char *malloc_conf; diff --git a/lib/libc/stdlib/Symbol.map b/lib/libc/stdlib/Symbol.map index 3d8657f1c6a0..2be23390e333 100644 --- a/lib/libc/stdlib/Symbol.map +++ b/lib/libc/stdlib/Symbol.map @@ -122,10 +122,10 @@ FBSD_1.5 { }; FBSD_1.6 { + ptsname_r; qsort_s; rand; srand; - ptsname_r; }; FBSDprivate_1.0 { diff --git a/lib/libc/stdlib/ptsname.c b/lib/libc/stdlib/ptsname.c index 247c02a6002b..6851d3d76555 100644 --- a/lib/libc/stdlib/ptsname.c +++ b/lib/libc/stdlib/ptsname.c @@ -76,7 +76,7 @@ __strong_reference(__isptmaster, unlockpt); * associated with the specified master. */ int -ptsname_r(int fildes, char *buffer, size_t buflen) +__ptsname_r(int fildes, char *buffer, size_t buflen) { if (buflen <= sizeof(_PATH_DEV)) { @@ -101,6 +101,8 @@ ptsname_r(int fildes, char *buffer, size_t buflen) return (0); } +__strong_reference(__ptsname_r, ptsname_r); + /* * ptsname(): return the pathname of the slave pseudo-terminal device * associated with the specified master. @@ -108,10 +110,10 @@ ptsname_r(int fildes, char *buffer, size_t buflen) char * ptsname(int fildes) { - static char pt_slave[sizeof _PATH_DEV + SPECNAMELEN]; + static char pt_slave[sizeof(_PATH_DEV) + SPECNAMELEN]; - if (ptsname_r(fildes, pt_slave, sizeof(pt_slave)) == 0) + if (__ptsname_r(fildes, pt_slave, sizeof(pt_slave)) == 0) return (pt_slave); - else - return (NULL); + + return (NULL); }