|
11 | 11 | * |
12 | 12 | * https://opensource.org/licenses/BSD-3-Clause |
13 | 13 | */ |
| 14 | +#define _QNX_SOURCE /* getpeereid */ |
14 | 15 | #define _GNU_SOURCE /* signals, threads, SO_PEERCRED */ |
15 | 16 |
|
16 | 17 | #include <stdint.h> |
@@ -1717,27 +1718,48 @@ nc_ps_clear(struct nc_pollsession *ps, int all, void (*data_free)(void *)) |
1717 | 1718 |
|
1718 | 1719 | #if defined(NC_ENABLED_SSH) || defined(NC_ENABLED_TLS) |
1719 | 1720 |
|
| 1721 | +static int |
| 1722 | +nc_get_uid(int sock, uid_t *uid) |
| 1723 | +{ |
| 1724 | + #ifdef SO_PEERCRED |
| 1725 | + struct ucred ucred; |
| 1726 | + socklen_t len; |
| 1727 | + len = sizeof(ucred); |
| 1728 | + if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) < 0) { |
| 1729 | + ERR("Failed to get credentials from unix socket (%s).", |
| 1730 | + strerror(errno)); |
| 1731 | + close(sock); |
| 1732 | + return -1; |
| 1733 | + } |
| 1734 | + *uid = ucred.uid; |
| 1735 | + #else |
| 1736 | + if (getpeereid(sock, uid, NULL) < 0) { |
| 1737 | + ERR("Failed to get credentials from unix socket (%s).", |
| 1738 | + strerror(errno)); |
| 1739 | + close(sock); |
| 1740 | + return -1; |
| 1741 | + } |
| 1742 | + #endif |
| 1743 | + |
| 1744 | + return 0; |
| 1745 | +} |
| 1746 | + |
1720 | 1747 | static int |
1721 | 1748 | nc_accept_unix(struct nc_session *session, int sock) |
1722 | 1749 | { |
1723 | | -#ifdef SO_PEERCRED |
| 1750 | +#if defined(SO_PEERCRED) || defined(HAVE_GETPEEREID) |
1724 | 1751 | const struct passwd *pw; |
1725 | | - struct ucred ucred; |
1726 | 1752 | char *username; |
1727 | | - socklen_t len; |
1728 | 1753 | session->ti_type = NC_TI_UNIX; |
| 1754 | + uid_t uid; |
1729 | 1755 |
|
1730 | | - len = sizeof(ucred); |
1731 | | - if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) < 0) { |
1732 | | - ERR("Failed to get credentials from unix socket (%s).", |
1733 | | - strerror(errno)); |
1734 | | - close(sock); |
| 1756 | + if (nc_get_uid(sock, &uid) < 0) { |
1735 | 1757 | return -1; |
1736 | 1758 | } |
1737 | 1759 |
|
1738 | | - pw = getpwuid(ucred.uid); |
| 1760 | + pw = getpwuid(uid); |
1739 | 1761 | if (pw == NULL) { |
1740 | | - ERR("Failed to find username for uid=%u (%s).\n", ucred.uid, |
| 1762 | + ERR("Failed to find username for uid=%u (%s).\n", uid, |
1741 | 1763 | strerror(errno)); |
1742 | 1764 | close(sock); |
1743 | 1765 | return -1; |
|
0 commit comments