Also added patch that is from alpine's same package to assist building on musl. Hostpkg build on musl also kept failing, so I added few more overrides, which made it work perfectly. Signed-off-by: Oskari Rauta <oskari.rauta@gmail.com>
144 lines
4.2 KiB
Diff
144 lines
4.2 KiB
Diff
--- a/support/nfsidmap/libnfsidmap.c
|
|
+++ b/support/nfsidmap/libnfsidmap.c
|
|
@@ -452,11 +452,17 @@ int nfs4_init_name_mapping(char *conffil
|
|
|
|
nobody_user = conf_get_str("Mapping", "Nobody-User");
|
|
if (nobody_user) {
|
|
- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ size_t buflen = 1024; /*value on my gentoo glibc system that has _SC_GETPW_R_SIZE_MAX*/
|
|
struct passwd *buf;
|
|
struct passwd *pw = NULL;
|
|
int err;
|
|
|
|
+ /*sysconf can return -1 when _SC_GETPW_R_SIZE_MAX is not defined, like on musl systems, if cast to size_t this will lead
|
|
+ to an integer overflow, which leads to a buffer overflow and crashes svcgssd */
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
+
|
|
buf = malloc(sizeof(*buf) + buflen);
|
|
if (buf) {
|
|
err = getpwnam_r(nobody_user, buf, ((char *)buf) + sizeof(*buf), buflen, &pw);
|
|
@@ -473,11 +479,17 @@ int nfs4_init_name_mapping(char *conffil
|
|
|
|
nobody_group = conf_get_str("Mapping", "Nobody-Group");
|
|
if (nobody_group) {
|
|
- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ size_t buflen = 1024; /*value on my gentoo glibc system that has _SC_GETGR_R_SIZE_MAX*/
|
|
struct group *buf;
|
|
struct group *gr = NULL;
|
|
int err;
|
|
|
|
+ /*sysconf can return -1 when _SC_GETGR_R_SIZE_MAX is not defined, like on musl systems, if cast to size_t this will lead
|
|
+ to an integer overflow, which leads to a buffer overflow and crashes svcgssd */
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
+
|
|
buf = malloc(sizeof(*buf) + buflen);
|
|
if (buf) {
|
|
err = getgrnam_r(nobody_group, buf, ((char *)buf) + sizeof(*buf), buflen, &gr);
|
|
--- a/support/nfsidmap/static.c
|
|
+++ b/support/nfsidmap/static.c
|
|
@@ -98,10 +98,14 @@ static struct passwd *static_getpwnam(co
|
|
{
|
|
struct passwd *pw;
|
|
struct pwbuf *buf;
|
|
- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ size_t buflen = 1024;
|
|
char *localname;
|
|
int err;
|
|
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
+
|
|
buf = malloc(sizeof(*buf) + buflen);
|
|
if (!buf) {
|
|
err = ENOMEM;
|
|
@@ -149,10 +153,14 @@ static struct group *static_getgrnam(con
|
|
{
|
|
struct group *gr;
|
|
struct grbuf *buf;
|
|
- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ size_t buflen = 1024;
|
|
char *localgroup;
|
|
int err;
|
|
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
+
|
|
buf = malloc(sizeof(*buf) + buflen);
|
|
if (!buf) {
|
|
err = ENOMEM;
|
|
--- a/support/nfsidmap/nss.c
|
|
+++ b/support/nfsidmap/nss.c
|
|
@@ -91,9 +91,13 @@ static int nss_uid_to_name(uid_t uid, ch
|
|
struct passwd *pw = NULL;
|
|
struct passwd pwbuf;
|
|
char *buf;
|
|
- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ size_t buflen = 1024;
|
|
int err = -ENOMEM;
|
|
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
+
|
|
buf = malloc(buflen);
|
|
if (!buf)
|
|
goto out;
|
|
@@ -119,9 +123,13 @@ static int nss_gid_to_name(gid_t gid, ch
|
|
struct group *gr = NULL;
|
|
struct group grbuf;
|
|
char *buf;
|
|
- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ size_t buflen = 1024;
|
|
int err;
|
|
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
+
|
|
if (domain == NULL)
|
|
domain = get_default_domain();
|
|
|
|
@@ -192,12 +200,13 @@ static struct passwd *nss_getpwnam(const
|
|
{
|
|
struct passwd *pw;
|
|
struct pwbuf *buf;
|
|
- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ size_t buflen = 1024;
|
|
char *localname;
|
|
int err = ENOMEM;
|
|
|
|
- if (buflen > UINT_MAX)
|
|
- goto err;
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
|
|
buf = malloc(sizeof(*buf) + buflen);
|
|
if (buf == NULL)
|
|
@@ -301,7 +310,8 @@ static int _nss_name_to_gid(char *name,
|
|
struct group *gr = NULL;
|
|
struct group grbuf;
|
|
char *buf, *domain;
|
|
- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
+ size_t buflen = 1024;
|
|
int err = -EINVAL;
|
|
char *localname = NULL;
|
|
char *ref_name = NULL;
|
|
@@ -327,8 +337,8 @@ static int _nss_name_to_gid(char *name,
|
|
}
|
|
|
|
err = -ENOMEM;
|
|
- if (buflen > UINT_MAX)
|
|
- goto out_name;
|
|
+ if (scbuflen > 0)
|
|
+ buflen = (size_t)scbuflen;
|
|
|
|
do {
|
|
buf = malloc(buflen);
|