getlogin_r: fix the type of len

getlogin_r is specified by POSIX to to take a size_t len, not int. Fix our
version to do the same, bump the symbol version due to ABI change and
provide compat.

This was reported to break compilation of Ruby 2.8.

Some discussion about the necessity of the ABI compat did take place in the
review. While many 64-bit platforms would likely be passing it in a 64-bit
register and zero-extended and thus, not notice ABI breakage, some do
sign-extend (e.g. mips).

PR:		247102
Submitted by:	Bertram Scharpf <software@bertram-scharpf.de> (original)
Submitted by:	cem (ABI compat)
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D26335
This commit is contained in:
Kyle Evans 2020-09-09 18:07:13 +00:00
parent d455cd5ac3
commit 69112cca60
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=365506
4 changed files with 15 additions and 5 deletions

View file

@ -399,7 +399,7 @@ int ftruncate(int, off_t);
#endif
#if __POSIX_VISIBLE >= 199506
int getlogin_r(char *, int);
int getlogin_r(char *, size_t);
#endif
/* 1003.1-2001 */

View file

@ -156,7 +156,6 @@ FBSD_1.0 {
gethostname;
getloadavg;
getlogin;
getlogin_r;
setnetgrent;
getnetgrent;
endnetgrent;
@ -422,6 +421,7 @@ FBSD_1.5 {
};
FBSD_1.6 {
getlogin_r;
memalign;
scandir_b;
sigandset;

View file

@ -58,7 +58,7 @@ getlogin(void)
}
int
getlogin_r(char *logname, int namelen)
getlogin_r(char *logname, size_t namelen)
{
char tmpname[MAXLOGNAME];
int len;
@ -75,3 +75,13 @@ getlogin_r(char *logname, int namelen)
strlcpy(logname, tmpname, len);
return (0);
}
/* FreeBSD 12 and earlier compat. */
int
__getlogin_r_fbsd12(char *logname, int namelen)
{
if (namelen < 1)
return (ERANGE);
return (getlogin_r(logname, namelen));
}
__sym_compat(getlogin_r, __getlogin_r_fbsd12, FBSD_1.0);

View file

@ -28,7 +28,7 @@
.\" @(#)getlogin.2 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
.Dd June 9, 1993
.Dd September 9, 2020
.Dt GETLOGIN 2
.Os
.Sh NAME
@ -44,7 +44,7 @@
.Fn getlogin void
.In sys/param.h
.Ft int
.Fn getlogin_r "char *name" "int len"
.Fn getlogin_r "char *name" "size_t len"
.Ft int
.Fn setlogin "const char *name"
.Sh DESCRIPTION