aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq/fe-auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/libpq/fe-auth.c')
-rw-r--r--src/interfaces/libpq/fe-auth.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c
index 5c8f404463f..4904d38ce1c 100644
--- a/src/interfaces/libpq/fe-auth.c
+++ b/src/interfaces/libpq/fe-auth.c
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
+#include <pwd.h>
#include <sys/param.h> /* for MAXHOSTNAMELEN on most */
#include <sys/socket.h>
#ifdef HAVE_SYS_UCRED_H
@@ -1203,7 +1204,10 @@ pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage)
char username[256 + 1];
DWORD namesize = sizeof(username);
#else
- char pwdbuf[BUFSIZ];
+ struct passwd pwbuf;
+ struct passwd *pw;
+ char buf[1024];
+ int rc;
#endif
#ifdef WIN32
@@ -1214,10 +1218,19 @@ pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage)
"user name lookup failure: error code %lu",
GetLastError());
#else
- if (pg_get_user_name(user_id, pwdbuf, sizeof(pwdbuf)))
- name = pwdbuf;
- else if (errorMessage)
- appendPQExpBuffer(errorMessage, "%s\n", pwdbuf);
+ rc = getpwuid_r(user_id, &pwbuf, buf, sizeof buf, &pw);
+ if (rc != 0)
+ {
+ errno = rc;
+ if (errorMessage)
+ libpq_append_error(errorMessage, "could not look up local user ID %ld: %m", (long) user_id);
+ }
+ else if (!pw)
+ {
+ if (errorMessage)
+ libpq_append_error(errorMessage, "local user with ID %ld does not exist", (long) user_id);
+ }
+ name = pw->pw_name;
#endif
if (name)