summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2019-10-30 11:01:44 +0100
committerPeter Eisentraut <peter@eisentraut.org>2019-10-30 11:18:00 +0100
commitc5e1df951d9d70ab7d53ce47caaf73f3b2d6b1e1 (patch)
tree4b2ed9df81db597372e7cf188dc4a3904f8bc9b7
parent5cc1e64fb6f59aa8621caae03be36400807e3575 (diff)
downloadpostgresql-c5e1df951d9d70ab7d53ce47caaf73f3b2d6b1e1.tar.gz
Remove one use of IDENT_USERNAME_MAX
IDENT_USERNAME_MAX is the maximum length of the information returned by an ident server, per RFC 1413. Using it as the buffer size in peer authentication is inappropriate. It was done here because of the historical relationship between peer and ident authentication. To reduce confusion between the two authenticaton methods and disentangle their code, use a dynamically allocated buffer instead. Discussion: https://www.postgresql.org/message-id/flat/c798fba5-8b71-4f27-c78e-37714037ea31%402ndquadrant.com
-rw-r--r--src/backend/libpq/auth.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index 58a44adeb7..d28271c1d8 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -65,7 +65,7 @@ static int CheckSCRAMAuth(Port *port, char *shadow_pass, char **logdetail);
* Ident authentication
*----------------------------------------------------------------
*/
-/* Max size of username ident server can return */
+/* Max size of username ident server can return (per RFC 1413) */
#define IDENT_USERNAME_MAX 512
/* Standard TCP port number for Ident service. Assigned by IANA */
@@ -1990,10 +1990,11 @@ ident_inet_done:
static int
auth_peer(hbaPort *port)
{
- char ident_user[IDENT_USERNAME_MAX + 1];
uid_t uid;
gid_t gid;
struct passwd *pw;
+ char *peer_user;
+ int ret;
if (getpeereid(port->sock, &uid, &gid) != 0)
{
@@ -2022,9 +2023,14 @@ auth_peer(hbaPort *port)
return STATUS_ERROR;
}
- strlcpy(ident_user, pw->pw_name, IDENT_USERNAME_MAX + 1);
+ /* Make a copy of static getpw*() result area. */
+ peer_user = pstrdup(pw->pw_name);
+
+ ret = check_usermap(port->hba->usermap, port->user_name, peer_user, false);
- return check_usermap(port->hba->usermap, port->user_name, ident_user, false);
+ pfree(peer_user);
+
+ return ret;
}
#endif /* HAVE_UNIX_SOCKETS */