summaryrefslogtreecommitdiff
path: root/third_party
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2019-05-21 08:00:05 +0200
committerAndreas Schneider <asn@cryptomilk.org>2019-05-23 11:10:28 +0000
commit3b608510e4be190d2aacf69dceefc937a25e10e7 (patch)
tree96d975298ebddd9e279baec4d90e55e7786770fa /third_party
parentd9af3dc02e98a3eb22441dfbdeddbaca0af078ea (diff)
downloadsamba-3b608510e4be190d2aacf69dceefc937a25e10e7.tar.gz
third_party: Update nss_wrapper to version 1.1.6
Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Gary Lockyer <gary@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Thu May 23 11:10:28 UTC 2019 on sn-devel-184
Diffstat (limited to 'third_party')
-rw-r--r--third_party/nss_wrapper/nss_wrapper.c206
-rw-r--r--third_party/nss_wrapper/wscript2
2 files changed, 147 insertions, 61 deletions
diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index 81d900c3f42..62c7af16774 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -2091,6 +2091,19 @@ static int nwrap_pw_copy_r(const struct passwd *src, struct passwd *dst,
dst->pw_passwd = buf + ofs;
dst->pw_uid = src->pw_uid;
dst->pw_gid = src->pw_gid;
+#ifdef HAVE_STRUCT_PASSWD_PW_CLASS
+ ofs = PTR_DIFF(src->pw_class, first);
+ dst->pw_class = buf + ofs;
+#endif /* HAVE_STRUCT_PASSWD_PW_CLASS */
+
+#ifdef HAVE_STRUCT_PASSWD_PW_CHANGE
+ dst->pw_change = 0;
+#endif /* HAVE_STRUCT_PASSWD_PW_CHANGE */
+
+#ifdef HAVE_STRUCT_PASSWD_PW_EXPIRE
+ dst->pw_expire = 0;
+#endif /* HAVE_STRUCT_PASSWD_PW_EXPIRE */
+
ofs = PTR_DIFF(src->pw_gecos, first);
dst->pw_gecos = buf + ofs;
ofs = PTR_DIFF(src->pw_dir, first);
@@ -2491,7 +2504,7 @@ static bool nwrap_gr_parse_line(struct nwrap_cache *nwrap, char *line)
}
gr->gr_mem[0] = NULL;
- for(nummem=0; p; nummem++) {
+ for(nummem = 0; p != NULL && p[0] != '\0'; nummem++) {
char **m;
size_t m_size;
c = p;
@@ -2550,50 +2563,84 @@ static void nwrap_gr_unload(struct nwrap_cache *nwrap)
static int nwrap_gr_copy_r(const struct group *src, struct group *dst,
char *buf, size_t buflen, struct group **dstp)
{
- char *first;
- char **lastm;
- char *last = NULL;
- off_t ofsb;
- off_t ofsm;
- off_t ofs;
+ char *p = NULL;
+ uintptr_t align = 0;
+ unsigned int gr_mem_cnt = 0;
unsigned i;
+ size_t total_len;
+ size_t gr_name_len = strlen(src->gr_name) + 1;
+ size_t gr_passwd_len = strlen(src->gr_passwd) + 1;
+ union {
+ char *ptr;
+ char **data;
+ } g_mem;
+
+ for (i = 0; src->gr_mem[i] != NULL; i++) {
+ gr_mem_cnt++;
+ }
+
+ /* Align the memory for storing pointers */
+ align = __alignof__(char *) - ((p - (char *)0) % __alignof__(char *));
+ total_len = align +
+ (1 + gr_mem_cnt) * sizeof(char *) +
+ gr_name_len + gr_passwd_len;
+
+ if (total_len > buflen) {
+ errno = ERANGE;
+ return -1;
+ }
+ buflen -= total_len;
- first = src->gr_name;
+ /* gr_mem */
+ p = buf + align;
+ g_mem.ptr = p;
+ dst->gr_mem = g_mem.data;
- lastm = src->gr_mem;
- while (*lastm) {
- last = *lastm;
- lastm++;
- }
+ /* gr_name */
+ p += (1 + gr_mem_cnt) * sizeof(char *);
+ dst->gr_name = p;
- if (last == NULL) {
- last = src->gr_passwd;
- }
- while (*last) last++;
+ /* gr_passwd */
+ p += gr_name_len;
+ dst->gr_passwd = p;
- ofsb = PTR_DIFF(last + 1, first);
- ofsm = PTR_DIFF(lastm + 1, src->gr_mem);
+ /* gr_mem[x] */
+ p += gr_passwd_len;
- if ((ofsb + ofsm) > (off_t) buflen) {
- return ERANGE;
+ /* gr_gid */
+ dst->gr_gid = src->gr_gid;
+
+ memcpy(dst->gr_name, src->gr_name, gr_name_len);
+
+ memcpy(dst->gr_passwd, src->gr_passwd, gr_passwd_len);
+
+ /* Set the terminating entry */
+ dst->gr_mem[gr_mem_cnt] = NULL;
+
+ /* Now add the group members content */
+ total_len = 0;
+ for (i = 0; i < gr_mem_cnt; i++) {
+ size_t len = strlen(src->gr_mem[i]) + 1;
+
+ dst->gr_mem[i] = p;
+ total_len += len;
+ p += len;
}
- memcpy(buf, first, ofsb);
- memcpy(buf + ofsb, src->gr_mem, ofsm);
+ if (total_len > buflen) {
+ errno = ERANGE;
+ return -1;
+ }
- ofs = PTR_DIFF(src->gr_name, first);
- dst->gr_name = buf + ofs;
- ofs = PTR_DIFF(src->gr_passwd, first);
- dst->gr_passwd = buf + ofs;
- dst->gr_gid = src->gr_gid;
+ for (i = 0; i < gr_mem_cnt; i++) {
+ size_t len = strlen(src->gr_mem[i]) + 1;
- dst->gr_mem = (char **)(buf + ofsb);
- for (i=0; src->gr_mem[i]; i++) {
- ofs = PTR_DIFF(src->gr_mem[i], first);
- dst->gr_mem[i] = buf + ofs;
+ memcpy(dst->gr_mem[i],
+ src->gr_mem[i],
+ len);
}
- if (dstp) {
+ if (dstp != NULL) {
*dstp = dst;
}
@@ -3465,7 +3512,8 @@ static int nwrap_files_gethostbyname(const char *name, int af,
name_len = strlen(name);
if (name_len < sizeof(canon_name) && name[name_len - 1] == '.') {
- strncpy(canon_name, name, name_len - 1);
+ memcpy(canon_name, name, name_len - 1);
+ canon_name[name_len] = '\0';
name = canon_name;
}
@@ -3547,6 +3595,10 @@ static int nwrap_gethostbyname_r(const char *name,
struct hostent **result, int *h_errnop)
{
struct nwrap_vector *addr_list = malloc(sizeof(struct nwrap_vector));
+ union {
+ char *ptr;
+ char **list;
+ } g;
int rc;
if (addr_list == NULL) {
@@ -3583,7 +3635,8 @@ static int nwrap_gethostbyname_r(const char *name,
free(addr_list->items);
free(addr_list);
- ret->h_addr_list = (char **)buf;
+ g.ptr = buf;
+ ret->h_addr_list = g.list;
*result = ret;
return 0;
}
@@ -3633,8 +3686,9 @@ static int nwrap_files_getaddrinfo(const char *name,
}
name_len = strlen(name);
- if (name_len < DNS_NAME_MAX && name[name_len - 1] == '.') {
- strncpy(canon_name, name, name_len - 1);
+ if (name_len < sizeof(canon_name) && name[name_len - 1] == '.') {
+ memcpy(canon_name, name, name_len - 1);
+ canon_name[name_len] = '\0';
name = canon_name;
}
@@ -5192,31 +5246,43 @@ static int nwrap_convert_he_ai(const struct hostent *he,
switch (he->h_addrtype) {
case AF_INET:
{
- struct sockaddr_in *sinp =
- (struct sockaddr_in *) ai->ai_addr;
+ union {
+ struct sockaddr *sa;
+ struct sockaddr_in *in;
+ } addr;
- memset(sinp, 0, sizeof(struct sockaddr_in));
+ addr.sa = ai->ai_addr;
- sinp->sin_port = htons(port);
- sinp->sin_family = AF_INET;
+ memset(addr.in, 0, sizeof(struct sockaddr_in));
- memset (sinp->sin_zero, '\0', sizeof (sinp->sin_zero));
- memcpy(&sinp->sin_addr, he->h_addr_list[0], he->h_length);
+ addr.in->sin_port = htons(port);
+ addr.in->sin_family = AF_INET;
+
+ memset(addr.in->sin_zero,
+ '\0',
+ sizeof (addr.in->sin_zero));
+ memcpy(&(addr.in->sin_addr),
+ he->h_addr_list[0],
+ he->h_length);
}
break;
#ifdef HAVE_IPV6
case AF_INET6:
{
- struct sockaddr_in6 *sin6p =
- (struct sockaddr_in6 *) ai->ai_addr;
+ union {
+ struct sockaddr *sa;
+ struct sockaddr_in6 *in6;
+ } addr;
- memset(sin6p, 0, sizeof(struct sockaddr_in6));
+ addr.sa = ai->ai_addr;
- sin6p->sin6_port = htons(port);
- sin6p->sin6_family = AF_INET6;
+ memset(addr.in6, 0, sizeof(struct sockaddr_in6));
- memcpy(&sin6p->sin6_addr,
+ addr.in6->sin6_port = htons(port);
+ addr.in6->sin6_family = AF_INET6;
+
+ memcpy(&addr.in6->sin6_addr,
he->h_addr_list[0],
he->h_length);
}
@@ -5453,21 +5519,41 @@ static int nwrap_getnameinfo(const struct sockaddr *sa, socklen_t salen,
type = sa->sa_family;
switch (type) {
- case AF_INET:
- if (salen < sizeof(struct sockaddr_in))
+ case AF_INET: {
+ union {
+ const struct sockaddr *sa;
+ const struct sockaddr_in *in;
+ } a;
+
+ if (salen < sizeof(struct sockaddr_in)) {
return EAI_FAMILY;
- addr = &((const struct sockaddr_in *)sa)->sin_addr;
- addrlen = sizeof(((const struct sockaddr_in *)sa)->sin_addr);
- port = ntohs(((const struct sockaddr_in *)sa)->sin_port);
+ }
+
+ a.sa = sa;
+
+ addr = &(a.in->sin_addr);
+ addrlen = sizeof(a.in->sin_addr);
+ port = ntohs(a.in->sin_port);
break;
+ }
#ifdef HAVE_IPV6
- case AF_INET6:
- if (salen < sizeof(struct sockaddr_in6))
+ case AF_INET6: {
+ union {
+ const struct sockaddr *sa;
+ const struct sockaddr_in6 *in6;
+ } a;
+
+ if (salen < sizeof(struct sockaddr_in6)) {
return EAI_FAMILY;
- addr = &((const struct sockaddr_in6 *)sa)->sin6_addr;
- addrlen = sizeof(((const struct sockaddr_in6 *)sa)->sin6_addr);
- port = ntohs(((const struct sockaddr_in6 *)sa)->sin6_port);
+ }
+
+ a.sa = sa;
+
+ addr = &(a.in6->sin6_addr);
+ addrlen = sizeof(a.in6->sin6_addr);
+ port = ntohs(a.in6->sin6_port);
break;
+ }
#endif
default:
return EAI_FAMILY;
diff --git a/third_party/nss_wrapper/wscript b/third_party/nss_wrapper/wscript
index 68e301cb1ad..127b5207c5e 100644
--- a/third_party/nss_wrapper/wscript
+++ b/third_party/nss_wrapper/wscript
@@ -2,7 +2,7 @@
import os
-VERSION="1.1.5"
+VERSION="1.1.6"
def configure(conf):
if conf.CHECK_NSS_WRAPPER():