third_party: Update nss_wrapper to version 1.1.6
authorAndreas Schneider <asn@samba.org>
Tue, 21 May 2019 06:00:05 +0000 (08:00 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 23 May 2019 11:10:28 +0000 (11:10 +0000)
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

buildtools/wafsamba/samba_third_party.py
third_party/nss_wrapper/nss_wrapper.c
third_party/nss_wrapper/wscript

index 1fe91d51aad87616548b40106e3f0d7dc94dc19c..f7410ecba5224382a123381eb9d9c1f1309c14a1 100644 (file)
@@ -47,7 +47,7 @@ Build.BuildContext.CHECK_SOCKET_WRAPPER = CHECK_SOCKET_WRAPPER
 
 @conf
 def CHECK_NSS_WRAPPER(conf):
-    return conf.CHECK_BUNDLED_SYSTEM_PKG('nss_wrapper', minversion='1.1.5')
+    return conf.CHECK_BUNDLED_SYSTEM_PKG('nss_wrapper', minversion='1.1.6')
 Build.BuildContext.CHECK_NSS_WRAPPER = CHECK_NSS_WRAPPER
 
 @conf
index 81d900c3f424fea9c16207b5d5dced437a617bf2..62c7af16774a16e9cf998d5eb3071428009121d0 100644 (file)
@@ -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;
index 68e301cb1adb2f1e1bb842448ffcf001fd546e19..127b5207c5e29b035b5a837e448269f4256a719a 100644 (file)
@@ -2,7 +2,7 @@
 
 import os
 
-VERSION="1.1.5"
+VERSION="1.1.6"
 
 def configure(conf):
     if conf.CHECK_NSS_WRAPPER():