diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
new file mode 100644
index a2f1c96..31ade0b
*** a/src/backend/libpq/auth.c
--- b/src/backend/libpq/auth.c
*************** auth_peer(hbaPort *port)
*** 1559,1567 ****
  	char		ident_user[IDENT_USERNAME_MAX + 1];
  	uid_t		uid;
  	gid_t		gid;
! 	struct passwd *pass;
  
- 	errno = 0;
  	if (getpeereid(port->sock, &uid, &gid) != 0)
  	{
  		/* Provide special error message if getpeereid is a stub */
--- 1559,1566 ----
  	char		ident_user[IDENT_USERNAME_MAX + 1];
  	uid_t		uid;
  	gid_t		gid;
! 	struct passwd *pw;
  
  	if (getpeereid(port->sock, &uid, &gid) != 0)
  	{
  		/* Provide special error message if getpeereid is a stub */
*************** auth_peer(hbaPort *port)
*** 1576,1592 ****
  		return STATUS_ERROR;
  	}
  
! 	pass = getpwuid(uid);
! 
! 	if (pass == NULL)
  	{
  		ereport(LOG,
! 				(errmsg("local user with ID %d does not exist",
! 						(int) uid)));
  		return STATUS_ERROR;
  	}
  
! 	strlcpy(ident_user, pass->pw_name, IDENT_USERNAME_MAX + 1);
  
  	return check_usermap(port->hba->usermap, port->user_name, ident_user, false);
  }
--- 1575,1591 ----
  		return STATUS_ERROR;
  	}
  
! 	errno = 0;					/* clear errno before call */
! 	pw = getpwuid(uid);
! 	if (!pw)
  	{
  		ereport(LOG,
! 				(errmsg("failed to look up local user id %ld: %s",
! 				(long) uid, errno ? strerror(errno) : _("user does not exist"))));
  		return STATUS_ERROR;
  	}
  
! 	strlcpy(ident_user, pw->pw_name, IDENT_USERNAME_MAX + 1);
  
  	return check_usermap(port->hba->usermap, port->user_name, ident_user, false);
  }
