0001-thread-safety-getpwuid_r.patch

text/plain

Filename: 0001-thread-safety-getpwuid_r.patch
Type: text/plain
Part: 0
Message: thread-safety: getpwuid_r()

Patch

Format: format-patch
Series: patch 0001
Subject: thread-safety: getpwuid_r()
File+
src/backend/libpq/auth.c 7 14
From 090c800afd6271885d345f72bbd1d3b535dd6886 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Sat, 24 Aug 2024 10:35:56 +0200
Subject: [PATCH] thread-safety: getpwuid_r()

There was one getpwuid() call in the backend.  We can replace that one
by the existing wrapper function pg_get_user_name(), which internally
uses getpwuid_r() for thread-safety.  And this also makes the code a
bit simpler.  The same function is already used in libpq for a purpose
that mirrors the backend use.
---
 src/backend/libpq/auth.c | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index 2b607c52704..85dcf9e9fc9 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -1857,7 +1857,7 @@ auth_peer(hbaPort *port)
 	uid_t		uid;
 	gid_t		gid;
 #ifndef WIN32
-	struct passwd *pw;
+	char		pwdbuf[BUFSIZ];
 	int			ret;
 #endif
 
@@ -1876,25 +1876,18 @@ auth_peer(hbaPort *port)
 	}
 
 #ifndef WIN32
-	errno = 0;					/* clear errno before call */
-	pw = getpwuid(uid);
-	if (!pw)
+	if (!pg_get_user_name(uid, pwdbuf, sizeof pwdbuf))
 	{
-		int			save_errno = errno;
-
-		ereport(LOG,
-				(errmsg("could not look up local user ID %ld: %s",
-						(long) uid,
-						save_errno ? strerror(save_errno) : _("user does not exist"))));
+		ereport(LOG, errmsg_internal("%s", pwdbuf));
 		return STATUS_ERROR;
 	}
 
 	/*
-	 * Make a copy of static getpw*() result area; this is our authenticated
-	 * identity.  Set it before calling check_usermap, because authentication
-	 * has already succeeded and we want the log file to reflect that.
+	 * Make a copy of result; this is our authenticated identity.  Set it
+	 * before calling check_usermap, because authentication has already
+	 * succeeded and we want the log file to reflect that.
 	 */
-	set_authn_id(port, pw->pw_name);
+	set_authn_id(port, pwdbuf);
 
 	ret = check_usermap(port->hba->usermap, port->user_name,
 						MyClientConnectionInfo.authn_id, false);
-- 
2.46.0