Auto-sync with upstream branch master
Upstream commit: d8425e116cdd954fea0c04c0f406179b5daebbb3
This commit is contained in:
parent
d3da0e913a
commit
b1ee1018fc
@ -239,8 +239,9 @@ Date: Sun Mar 1 23:22:45 2015 +0100
|
||||
[BZ #18023]
|
||||
* include/alloca.h (stackinfo_alloca_round, extend_alloca,
|
||||
extend_alloca_account): Remove.
|
||||
Index: b/elf/dl-deps.c
|
||||
===================================================================
|
||||
|
||||
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
|
||||
index 35cad364b7dfdf0d..0fae87a0bb976335 100644
|
||||
--- a/elf/dl-deps.c
|
||||
+++ b/elf/dl-deps.c
|
||||
@@ -27,6 +27,7 @@
|
||||
@ -251,7 +252,7 @@ Index: b/elf/dl-deps.c
|
||||
|
||||
#include <dl-dst.h>
|
||||
|
||||
@@ -184,9 +185,8 @@ _dl_map_object_deps (struct link_map *ma
|
||||
@@ -181,9 +182,8 @@ _dl_map_object_deps (struct link_map *map,
|
||||
/* Pointer to last unique object. */
|
||||
tail = &known[nlist - 1];
|
||||
|
||||
@ -263,7 +264,7 @@ Index: b/elf/dl-deps.c
|
||||
|
||||
/* Process each element of the search list, loading each of its
|
||||
auxiliary objects and immediate dependencies. Auxiliary objects
|
||||
@@ -217,13 +217,12 @@ _dl_map_object_deps (struct link_map *ma
|
||||
@@ -213,13 +213,12 @@ _dl_map_object_deps (struct link_map *map,
|
||||
if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL
|
||||
&& l != map && l->l_ldnum > 0)
|
||||
{
|
||||
@ -283,7 +284,7 @@ Index: b/elf/dl-deps.c
|
||||
}
|
||||
|
||||
if (l->l_info[DT_NEEDED] || l->l_info[AUXTAG] || l->l_info[FILTERTAG])
|
||||
@@ -463,8 +462,11 @@ _dl_map_object_deps (struct link_map *ma
|
||||
@@ -438,8 +437,11 @@ _dl_map_object_deps (struct link_map *map,
|
||||
struct link_map **l_initfini = (struct link_map **)
|
||||
malloc ((2 * nneeded + 1) * sizeof needed[0]);
|
||||
if (l_initfini == NULL)
|
||||
@ -297,7 +298,7 @@ Index: b/elf/dl-deps.c
|
||||
l_initfini[0] = l;
|
||||
memcpy (&l_initfini[1], needed, nneeded * sizeof needed[0]);
|
||||
memcpy (&l_initfini[nneeded + 1], l_initfini,
|
||||
@@ -482,6 +484,8 @@ _dl_map_object_deps (struct link_map *ma
|
||||
@@ -457,6 +459,8 @@ _dl_map_object_deps (struct link_map *map,
|
||||
}
|
||||
|
||||
out:
|
||||
@ -306,8 +307,8 @@ Index: b/elf/dl-deps.c
|
||||
if (errno == 0 && errno_saved != 0)
|
||||
__set_errno (errno_saved);
|
||||
|
||||
Index: b/include/alloca.h
|
||||
===================================================================
|
||||
diff --git a/include/alloca.h b/include/alloca.h
|
||||
index fd90664f0a17cd6d..c0b83954436ed4c1 100644
|
||||
--- a/include/alloca.h
|
||||
+++ b/include/alloca.h
|
||||
@@ -23,57 +23,17 @@ libc_hidden_proto (__libc_alloca_cutoff)
|
||||
@ -368,79 +369,8 @@ Index: b/include/alloca.h
|
||||
#endif
|
||||
|
||||
# endif /* !_ISOMAC */
|
||||
Index: b/nss/nss_compat/compat-initgroups.c
|
||||
===================================================================
|
||||
--- a/nss/nss_compat/compat-initgroups.c
|
||||
+++ b/nss/nss_compat/compat-initgroups.c
|
||||
@@ -262,7 +262,6 @@ getgrent_next_nss (ent_t *ent, char *buf
|
||||
overwrite the pointer with one to a bigger buffer. */
|
||||
char *tmpbuf = buffer;
|
||||
size_t tmplen = buflen;
|
||||
- bool use_malloc = false;
|
||||
|
||||
for (int i = 0; i < mystart; i++)
|
||||
{
|
||||
@@ -271,29 +270,26 @@ getgrent_next_nss (ent_t *ent, char *buf
|
||||
== NSS_STATUS_TRYAGAIN
|
||||
&& *errnop == ERANGE)
|
||||
{
|
||||
- if (__libc_use_alloca (tmplen * 2))
|
||||
- {
|
||||
- if (tmpbuf == buffer)
|
||||
- {
|
||||
- tmplen *= 2;
|
||||
- tmpbuf = __alloca (tmplen);
|
||||
- }
|
||||
- else
|
||||
- tmpbuf = extend_alloca (tmpbuf, tmplen, tmplen * 2);
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- tmplen *= 2;
|
||||
- char *newbuf = realloc (use_malloc ? tmpbuf : NULL, tmplen);
|
||||
-
|
||||
- if (newbuf == NULL)
|
||||
- {
|
||||
- status = NSS_STATUS_TRYAGAIN;
|
||||
- goto done;
|
||||
- }
|
||||
- use_malloc = true;
|
||||
- tmpbuf = newbuf;
|
||||
- }
|
||||
+ /* Check for overflow. */
|
||||
+ if (__glibc_unlikely (tmplen * 2 < tmplen))
|
||||
+ {
|
||||
+ __set_errno (ENOMEM);
|
||||
+ status = NSS_STATUS_TRYAGAIN;
|
||||
+ goto done;
|
||||
+ }
|
||||
+ /* Increase the size. Make sure that we retry
|
||||
+ with a reasonable size. */
|
||||
+ tmplen *= 2;
|
||||
+ if (tmplen < 1024)
|
||||
+ tmplen = 1024;
|
||||
+ if (tmpbuf != buffer)
|
||||
+ free (tmpbuf);
|
||||
+ tmpbuf = malloc (tmplen);
|
||||
+ if (__glibc_unlikely (tmpbuf == NULL))
|
||||
+ {
|
||||
+ status = NSS_STATUS_TRYAGAIN;
|
||||
+ goto done;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (__builtin_expect (status != NSS_STATUS_NOTFOUND, 1))
|
||||
@@ -321,7 +317,7 @@ getgrent_next_nss (ent_t *ent, char *buf
|
||||
status = NSS_STATUS_NOTFOUND;
|
||||
|
||||
done:
|
||||
- if (use_malloc)
|
||||
+ if (tmpbuf != buffer)
|
||||
free (tmpbuf);
|
||||
}
|
||||
|
||||
Index: b/nis/nss_nis/nis-initgroups.c
|
||||
===================================================================
|
||||
diff --git a/nis/nss_nis/nis-initgroups.c b/nis/nss_nis/nis-initgroups.c
|
||||
index 3784c101f7ee31aa..c872b32e15f55e3d 100644
|
||||
--- a/nis/nss_nis/nis-initgroups.c
|
||||
+++ b/nis/nss_nis/nis-initgroups.c
|
||||
@@ -16,7 +16,6 @@
|
||||
@ -459,7 +389,7 @@ Index: b/nis/nss_nis/nis-initgroups.c
|
||||
|
||||
#include "nss-nis.h"
|
||||
#include <libnsl.h>
|
||||
@@ -120,27 +120,30 @@ internal_getgrent_r (struct group *grp,
|
||||
@@ -120,27 +120,30 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen,
|
||||
static int
|
||||
get_uid (const char *user, uid_t *uidp)
|
||||
{
|
||||
@ -494,7 +424,7 @@ Index: b/nis/nss_nis/nis-initgroups.c
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -254,8 +257,6 @@ _nss_nis_initgroups_dyn (const char *use
|
||||
@@ -254,8 +257,6 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
}
|
||||
|
||||
struct group grpbuf, *g;
|
||||
@ -503,7 +433,7 @@ Index: b/nis/nss_nis/nis-initgroups.c
|
||||
enum nss_status status;
|
||||
intern_t intern = { NULL, NULL, 0 };
|
||||
gid_t *groups = *groupsp;
|
||||
@@ -264,15 +265,21 @@ _nss_nis_initgroups_dyn (const char *use
|
||||
@@ -264,15 +265,21 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
|
||||
@ -536,8 +466,8 @@ Index: b/nis/nss_nis/nis-initgroups.c
|
||||
|
||||
return status;
|
||||
}
|
||||
Index: b/nscd/aicache.c
|
||||
===================================================================
|
||||
diff --git a/nscd/aicache.c b/nscd/aicache.c
|
||||
index a3de792cc429b546..7064d12a15b3e19d 100644
|
||||
--- a/nscd/aicache.c
|
||||
+++ b/nscd/aicache.c
|
||||
@@ -28,6 +28,7 @@
|
||||
@ -548,7 +478,7 @@ Index: b/nscd/aicache.c
|
||||
|
||||
#include "dbg_log.h"
|
||||
#include "nscd.h"
|
||||
@@ -111,10 +112,13 @@ addhstaiX (struct database_dyn *db, int
|
||||
@@ -111,10 +112,13 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
if (ctx == NULL)
|
||||
no_more = 1;
|
||||
|
||||
@ -566,7 +496,7 @@ Index: b/nscd/aicache.c
|
||||
int32_t ttl = INT32_MAX;
|
||||
ssize_t total = 0;
|
||||
char *key_copy = NULL;
|
||||
@@ -127,6 +131,7 @@ addhstaiX (struct database_dyn *db, int
|
||||
@@ -127,6 +131,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
int status[2] = { NSS_STATUS_UNAVAIL, NSS_STATUS_UNAVAIL };
|
||||
int naddrs = 0;
|
||||
size_t addrslen = 0;
|
||||
@ -574,7 +504,7 @@ Index: b/nscd/aicache.c
|
||||
char *canon = NULL;
|
||||
size_t canonlen;
|
||||
|
||||
@@ -141,12 +146,17 @@ addhstaiX (struct database_dyn *db, int
|
||||
@@ -141,12 +146,17 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
at = &atmem;
|
||||
rc6 = 0;
|
||||
herrno = 0;
|
||||
@ -594,7 +524,7 @@ Index: b/nscd/aicache.c
|
||||
}
|
||||
|
||||
if (rc6 != 0 && herrno == NETDB_INTERNAL)
|
||||
@@ -224,41 +234,38 @@ addhstaiX (struct database_dyn *db, int
|
||||
@@ -224,41 +234,38 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
while (1)
|
||||
{
|
||||
rc6 = 0;
|
||||
@ -652,7 +582,7 @@ Index: b/nscd/aicache.c
|
||||
}
|
||||
|
||||
if (rc4 != 0 && herrno == NETDB_INTERNAL)
|
||||
@@ -284,13 +291,11 @@ addhstaiX (struct database_dyn *db, int
|
||||
@@ -284,13 +291,11 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
cfct = __nss_lookup_function (nip, "getcanonname_r");
|
||||
if (cfct != NULL)
|
||||
{
|
||||
@ -668,7 +598,7 @@ Index: b/nscd/aicache.c
|
||||
== NSS_STATUS_SUCCESS)
|
||||
canon = s;
|
||||
else
|
||||
@@ -319,18 +324,20 @@ addhstaiX (struct database_dyn *db, int
|
||||
@@ -319,18 +324,20 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
addrfamily = AF_INET6;
|
||||
}
|
||||
|
||||
@ -705,11 +635,11 @@ Index: b/nscd/aicache.c
|
||||
return timeout;
|
||||
}
|
||||
|
||||
Index: b/nscd/connections.c
|
||||
===================================================================
|
||||
diff --git a/nscd/connections.c b/nscd/connections.c
|
||||
index cc1ed72077640a8b..2f69800ee5ca83b4 100644
|
||||
--- a/nscd/connections.c
|
||||
+++ b/nscd/connections.c
|
||||
@@ -1324,64 +1324,83 @@ request from '%s' [%ld] not handled due
|
||||
@@ -1324,64 +1324,83 @@ request from '%s' [%ld] not handled due to missing permission"),
|
||||
}
|
||||
}
|
||||
|
||||
@ -729,20 +659,19 @@ Index: b/nscd/connections.c
|
||||
- size_t readlen = 0;
|
||||
int fd = open ("/proc/self/cmdline", O_RDONLY);
|
||||
- if (fd == -1)
|
||||
- {
|
||||
- dbg_log (_("\
|
||||
-cannot open /proc/self/cmdline: %s; disabling paranoia mode"),
|
||||
- strerror (errno));
|
||||
-
|
||||
- paranoia = 0;
|
||||
- return;
|
||||
+ if (fd < 0)
|
||||
+ return NULL;
|
||||
+ size_t current = 0;
|
||||
+ size_t limit = 1024;
|
||||
+ char *buffer = malloc (limit);
|
||||
+ if (buffer == NULL)
|
||||
+ {
|
||||
{
|
||||
- dbg_log (_("\
|
||||
-cannot open /proc/self/cmdline: %s; disabling paranoia mode"),
|
||||
- strerror (errno));
|
||||
-
|
||||
- paranoia = 0;
|
||||
- return;
|
||||
+ close (fd);
|
||||
+ errno = ENOMEM;
|
||||
+ return NULL;
|
||||
@ -832,7 +761,7 @@ Index: b/nscd/connections.c
|
||||
{
|
||||
argv[argc++] = cp;
|
||||
cp = (char *) rawmemchr (cp, '\0') + 1;
|
||||
@@ -1398,6 +1417,7 @@ cannot change to old UID: %s; disabling
|
||||
@@ -1398,6 +1417,7 @@ cannot change to old UID: %s; disabling paranoia mode"),
|
||||
strerror (errno));
|
||||
|
||||
paranoia = 0;
|
||||
@ -840,7 +769,7 @@ Index: b/nscd/connections.c
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1409,6 +1429,7 @@ cannot change to old GID: %s; disabling
|
||||
@@ -1409,6 +1429,7 @@ cannot change to old GID: %s; disabling paranoia mode"),
|
||||
|
||||
ignore_value (setuid (server_uid));
|
||||
paranoia = 0;
|
||||
@ -848,7 +777,7 @@ Index: b/nscd/connections.c
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1426,6 +1447,7 @@ cannot change to old working directory:
|
||||
@@ -1426,6 +1447,7 @@ cannot change to old working directory: %s; disabling paranoia mode"),
|
||||
ignore_value (setgid (server_gid));
|
||||
}
|
||||
paranoia = 0;
|
||||
@ -856,7 +785,7 @@ Index: b/nscd/connections.c
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1474,6 +1496,7 @@ cannot change to old working directory:
|
||||
@@ -1474,6 +1496,7 @@ cannot change to old working directory: %s; disabling paranoia mode"),
|
||||
dbg_log (_("cannot change current working directory to \"/\": %s"),
|
||||
strerror (errno));
|
||||
paranoia = 0;
|
||||
@ -864,8 +793,8 @@ Index: b/nscd/connections.c
|
||||
|
||||
/* Reenable the databases. */
|
||||
time_t now = time (NULL);
|
||||
Index: b/nscd/grpcache.c
|
||||
===================================================================
|
||||
diff --git a/nscd/grpcache.c b/nscd/grpcache.c
|
||||
index d2ad53509db97bdf..a71036512048dd81 100644
|
||||
--- a/nscd/grpcache.c
|
||||
+++ b/nscd/grpcache.c
|
||||
@@ -16,7 +16,6 @@
|
||||
@ -884,7 +813,7 @@ Index: b/nscd/grpcache.c
|
||||
|
||||
#include "nscd.h"
|
||||
#include "dbg_log.h"
|
||||
@@ -448,12 +448,12 @@ addgrbyX (struct database_dyn *db, int f
|
||||
@@ -448,12 +448,12 @@ addgrbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
look again in the table whether the dataset is now available. We
|
||||
simply insert it. It does not matter if it is in there twice. The
|
||||
pruning function only will look at the timestamp. */
|
||||
@ -900,7 +829,7 @@ Index: b/nscd/grpcache.c
|
||||
|
||||
if (__glibc_unlikely (debug_level > 0))
|
||||
{
|
||||
@@ -463,43 +463,24 @@ addgrbyX (struct database_dyn *db, int f
|
||||
@@ -463,43 +463,24 @@ addgrbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
dbg_log (_("Reloading \"%s\" in group cache!"), keystr);
|
||||
}
|
||||
|
||||
@ -959,8 +888,8 @@ Index: b/nscd/grpcache.c
|
||||
return timeout;
|
||||
}
|
||||
|
||||
Index: b/nscd/hstcache.c
|
||||
===================================================================
|
||||
diff --git a/nscd/hstcache.c b/nscd/hstcache.c
|
||||
index 9f6ce979ac333265..d0af99893dd17b9f 100644
|
||||
--- a/nscd/hstcache.c
|
||||
+++ b/nscd/hstcache.c
|
||||
@@ -34,6 +34,7 @@
|
||||
@ -971,7 +900,7 @@ Index: b/nscd/hstcache.c
|
||||
|
||||
#include "nscd.h"
|
||||
#include "dbg_log.h"
|
||||
@@ -463,11 +464,8 @@ addhstbyX (struct database_dyn *db, int
|
||||
@@ -463,11 +464,8 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
look again in the table whether the dataset is now available. We
|
||||
simply insert it. It does not matter if it is in there twice. The
|
||||
pruning function only will look at the timestamp. */
|
||||
@ -983,7 +912,7 @@ Index: b/nscd/hstcache.c
|
||||
int errval = 0;
|
||||
int32_t ttl = INT32_MAX;
|
||||
|
||||
@@ -487,46 +485,30 @@ addhstbyX (struct database_dyn *db, int
|
||||
@@ -487,46 +485,30 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
dbg_log (_("Reloading \"%s\" in hosts cache!"), (char *) str);
|
||||
}
|
||||
|
||||
@ -1049,8 +978,8 @@ Index: b/nscd/hstcache.c
|
||||
return timeout;
|
||||
}
|
||||
|
||||
Index: b/nscd/pwdcache.c
|
||||
===================================================================
|
||||
diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c
|
||||
index 721f4c617b0bb74a..9349b54df4241ad5 100644
|
||||
--- a/nscd/pwdcache.c
|
||||
+++ b/nscd/pwdcache.c
|
||||
@@ -16,7 +16,6 @@
|
||||
@ -1069,7 +998,7 @@ Index: b/nscd/pwdcache.c
|
||||
|
||||
#include "nscd.h"
|
||||
#include "dbg_log.h"
|
||||
@@ -426,12 +426,11 @@ addpwbyX (struct database_dyn *db, int f
|
||||
@@ -426,12 +426,11 @@ addpwbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
look again in the table whether the dataset is now available. We
|
||||
simply insert it. It does not matter if it is in there twice. The
|
||||
pruning function only will look at the timestamp. */
|
||||
@ -1084,7 +1013,7 @@ Index: b/nscd/pwdcache.c
|
||||
|
||||
if (__glibc_unlikely (debug_level > 0))
|
||||
{
|
||||
@@ -441,45 +440,26 @@ addpwbyX (struct database_dyn *db, int f
|
||||
@@ -441,45 +440,26 @@ addpwbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
dbg_log (_("Reloading \"%s\" in password cache!"), keystr);
|
||||
}
|
||||
|
||||
@ -1145,8 +1074,8 @@ Index: b/nscd/pwdcache.c
|
||||
return timeout;
|
||||
}
|
||||
|
||||
Index: b/nscd/servicescache.c
|
||||
===================================================================
|
||||
diff --git a/nscd/servicescache.c b/nscd/servicescache.c
|
||||
index 131ba6ddcc1a5f7a..549e9a446816d760 100644
|
||||
--- a/nscd/servicescache.c
|
||||
+++ b/nscd/servicescache.c
|
||||
@@ -16,7 +16,6 @@
|
||||
@ -1165,7 +1094,7 @@ Index: b/nscd/servicescache.c
|
||||
|
||||
#include "nscd.h"
|
||||
#include "dbg_log.h"
|
||||
@@ -374,12 +374,11 @@ addservbyX (struct database_dyn *db, int
|
||||
@@ -374,12 +374,11 @@ addservbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
look again in the table whether the dataset is now available. We
|
||||
simply insert it. It does not matter if it is in there twice. The
|
||||
pruning function only will look at the timestamp. */
|
||||
@ -1180,7 +1109,7 @@ Index: b/nscd/servicescache.c
|
||||
|
||||
if (__glibc_unlikely (debug_level > 0))
|
||||
{
|
||||
@@ -389,43 +388,24 @@ addservbyX (struct database_dyn *db, int
|
||||
@@ -389,43 +388,24 @@ addservbyX (struct database_dyn *db, int fd, request_header *req,
|
||||
dbg_log (_("Reloading \"%s\" in services cache!"), key);
|
||||
}
|
||||
|
||||
@ -1239,8 +1168,8 @@ Index: b/nscd/servicescache.c
|
||||
return timeout;
|
||||
}
|
||||
|
||||
Index: b/nss/getent.c
|
||||
===================================================================
|
||||
diff --git a/nss/getent.c b/nss/getent.c
|
||||
index 8f8c3fe80a2cfea6..5654c5f67c4f118c 100644
|
||||
--- a/nss/getent.c
|
||||
+++ b/nss/getent.c
|
||||
@@ -39,6 +39,7 @@
|
||||
@ -1293,7 +1222,7 @@ Index: b/nss/getent.c
|
||||
printf ("%-21s", key[i]);
|
||||
for (int j = 0; j < n; ++j)
|
||||
if (grps[j] != -1)
|
||||
@@ -508,6 +513,8 @@ initgroups_keys (int number, char *key[]
|
||||
@@ -508,6 +513,8 @@ initgroups_keys (int number, char *key[])
|
||||
putchar_unlocked ('\n');
|
||||
}
|
||||
|
||||
@ -1302,111 +1231,79 @@ Index: b/nss/getent.c
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index: b/nss/nss_files/files-hosts.c
|
||||
===================================================================
|
||||
--- a/nss/nss_files/files-hosts.c
|
||||
+++ b/nss/nss_files/files-hosts.c
|
||||
@@ -22,7 +22,7 @@
|
||||
#include <arpa/nameser.h>
|
||||
#include <netdb.h>
|
||||
#include <resolv/resolv-internal.h>
|
||||
diff --git a/nss/nss_compat/compat-initgroups.c b/nss/nss_compat/compat-initgroups.c
|
||||
index c1a9301a3b0c3ee0..bae8765afbd109e9 100644
|
||||
--- a/nss/nss_compat/compat-initgroups.c
|
||||
+++ b/nss/nss_compat/compat-initgroups.c
|
||||
@@ -261,7 +261,6 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
overwrite the pointer with one to a bigger buffer. */
|
||||
char *tmpbuf = buffer;
|
||||
size_t tmplen = buflen;
|
||||
- bool use_malloc = false;
|
||||
|
||||
for (int i = 0; i < mystart; i++)
|
||||
{
|
||||
@@ -270,29 +269,26 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
== NSS_STATUS_TRYAGAIN
|
||||
&& *errnop == ERANGE)
|
||||
{
|
||||
- if (__libc_use_alloca (tmplen * 2))
|
||||
- {
|
||||
- if (tmpbuf == buffer)
|
||||
- {
|
||||
- tmplen *= 2;
|
||||
- tmpbuf = __alloca (tmplen);
|
||||
- }
|
||||
- else
|
||||
- tmpbuf = extend_alloca (tmpbuf, tmplen, tmplen * 2);
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- tmplen *= 2;
|
||||
- char *newbuf = realloc (use_malloc ? tmpbuf : NULL, tmplen);
|
||||
-
|
||||
+#include <scratch_buffer.h>
|
||||
- if (newbuf == NULL)
|
||||
- {
|
||||
- status = NSS_STATUS_TRYAGAIN;
|
||||
- goto done;
|
||||
- }
|
||||
- use_malloc = true;
|
||||
- tmpbuf = newbuf;
|
||||
- }
|
||||
+ /* Check for overflow. */
|
||||
+ if (__glibc_unlikely (tmplen * 2 < tmplen))
|
||||
+ {
|
||||
+ __set_errno (ENOMEM);
|
||||
+ status = NSS_STATUS_TRYAGAIN;
|
||||
+ goto done;
|
||||
+ }
|
||||
+ /* Increase the size. Make sure that we retry
|
||||
+ with a reasonable size. */
|
||||
+ tmplen *= 2;
|
||||
+ if (tmplen < 1024)
|
||||
+ tmplen = 1024;
|
||||
+ if (tmpbuf != buffer)
|
||||
+ free (tmpbuf);
|
||||
+ tmpbuf = malloc (tmplen);
|
||||
+ if (__glibc_unlikely (tmpbuf == NULL))
|
||||
+ {
|
||||
+ status = NSS_STATUS_TRYAGAIN;
|
||||
+ goto done;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Get implementation for some internal functions. */
|
||||
#include "../resolv/mapv4v6addr.h"
|
||||
@@ -145,15 +145,12 @@ _nss_files_gethostbyname3_r (const char
|
||||
&& _res_hconf.flags & HCONF_FLAG_MULTI)
|
||||
{
|
||||
/* We have to get all host entries from the file. */
|
||||
- size_t tmp_buflen = MIN (buflen, 4096);
|
||||
- char tmp_buffer_stack[tmp_buflen]
|
||||
- __attribute__ ((__aligned__ (__alignof__ (struct hostent_data))));
|
||||
- char *tmp_buffer = tmp_buffer_stack;
|
||||
struct hostent tmp_result_buf;
|
||||
int naddrs = 1;
|
||||
int naliases = 0;
|
||||
char *bufferend;
|
||||
- bool tmp_buffer_malloced = false;
|
||||
+ struct scratch_buffer tmpbuf;
|
||||
+ scratch_buffer_init (&tmpbuf);
|
||||
if (__builtin_expect (status != NSS_STATUS_NOTFOUND, 1))
|
||||
@@ -320,7 +316,7 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
status = NSS_STATUS_NOTFOUND;
|
||||
|
||||
while (result->h_aliases[naliases] != NULL)
|
||||
++naliases;
|
||||
@@ -161,9 +158,9 @@ _nss_files_gethostbyname3_r (const char
|
||||
bufferend = (char *) &result->h_aliases[naliases + 1];
|
||||
|
||||
again:
|
||||
- while ((status = internal_getent (stream, &tmp_result_buf, tmp_buffer,
|
||||
- tmp_buflen, errnop, herrnop, af,
|
||||
- flags))
|
||||
+ while ((status = internal_getent (stream, &tmp_result_buf,
|
||||
+ tmpbuf.data, tmpbuf.length,
|
||||
+ errnop, herrnop, af, flags))
|
||||
== NSS_STATUS_SUCCESS)
|
||||
{
|
||||
int matches = 1;
|
||||
@@ -287,54 +284,13 @@ _nss_files_gethostbyname3_r (const char
|
||||
}
|
||||
done:
|
||||
- if (use_malloc)
|
||||
+ if (tmpbuf != buffer)
|
||||
free (tmpbuf);
|
||||
}
|
||||
|
||||
- if (status == NSS_STATUS_TRYAGAIN)
|
||||
- {
|
||||
- size_t newsize = 2 * tmp_buflen;
|
||||
- if (tmp_buffer_malloced)
|
||||
- {
|
||||
- char *newp = realloc (tmp_buffer, newsize);
|
||||
- if (newp != NULL)
|
||||
- {
|
||||
- assert ((((uintptr_t) newp)
|
||||
- & (__alignof__ (struct hostent_data) - 1))
|
||||
- == 0);
|
||||
- tmp_buffer = newp;
|
||||
- tmp_buflen = newsize;
|
||||
- goto again;
|
||||
- }
|
||||
- }
|
||||
- else if (!__libc_use_alloca (buflen + newsize))
|
||||
- {
|
||||
- tmp_buffer = malloc (newsize);
|
||||
- if (tmp_buffer != NULL)
|
||||
- {
|
||||
- assert ((((uintptr_t) tmp_buffer)
|
||||
- & (__alignof__ (struct hostent_data) - 1))
|
||||
- == 0);
|
||||
- tmp_buffer_malloced = true;
|
||||
- tmp_buflen = newsize;
|
||||
- goto again;
|
||||
- }
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- tmp_buffer
|
||||
- = extend_alloca (tmp_buffer, tmp_buflen,
|
||||
- newsize
|
||||
- + __alignof__ (struct hostent_data));
|
||||
- tmp_buffer = (char *) (((uintptr_t) tmp_buffer
|
||||
- + __alignof__ (struct hostent_data)
|
||||
- - 1)
|
||||
- & ~(__alignof__ (struct hostent_data)
|
||||
- - 1));
|
||||
- goto again;
|
||||
- }
|
||||
- }
|
||||
+ if (status == NSS_STATUS_TRYAGAIN
|
||||
+ && scratch_buffer_grow (&tmpbuf))
|
||||
+ goto again;
|
||||
else
|
||||
status = NSS_STATUS_SUCCESS;
|
||||
out:
|
||||
- if (tmp_buffer_malloced)
|
||||
- free (tmp_buffer);
|
||||
+ scratch_buffer_free (&tmpbuf);
|
||||
}
|
||||
|
||||
internal_endent (&stream);
|
||||
Index: b/nss/nss_files/files-initgroups.c
|
||||
===================================================================
|
||||
diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c
|
||||
index 27cd8ece40434f5c..8a88f1b62357d3bd 100644
|
||||
--- a/nss/nss_files/files-initgroups.c
|
||||
+++ b/nss/nss_files/files-initgroups.c
|
||||
@@ -16,7 +16,6 @@
|
||||
@ -1425,7 +1322,7 @@ Index: b/nss/nss_files/files-initgroups.c
|
||||
|
||||
enum nss_status
|
||||
_nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
@@ -46,9 +46,8 @@ _nss_files_initgroups_dyn (const char *u
|
||||
@@ -46,9 +46,8 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
enum nss_status status = NSS_STATUS_SUCCESS;
|
||||
bool any = false;
|
||||
|
||||
@ -1437,7 +1334,7 @@ Index: b/nss/nss_files/files-initgroups.c
|
||||
|
||||
gid_t *groups = *groupsp;
|
||||
|
||||
@@ -67,26 +66,16 @@ _nss_files_initgroups_dyn (const char *u
|
||||
@@ -67,26 +66,16 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
}
|
||||
|
||||
struct group grp;
|
||||
@ -1470,7 +1367,7 @@ Index: b/nss/nss_files/files-initgroups.c
|
||||
/* Reread current line, the parser has clobbered it. */
|
||||
fsetpos (stream, &pos);
|
||||
continue;
|
||||
@@ -132,8 +121,7 @@ _nss_files_initgroups_dyn (const char *u
|
||||
@@ -132,8 +121,7 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
|
||||
out:
|
||||
/* Free memory. */
|
||||
@ -1480,8 +1377,8 @@ Index: b/nss/nss_files/files-initgroups.c
|
||||
free (line);
|
||||
|
||||
fclose (stream);
|
||||
Index: b/posix/wordexp.c
|
||||
===================================================================
|
||||
diff --git a/posix/wordexp.c b/posix/wordexp.c
|
||||
index e4cfce946013dc78..a751fb32b286aec2 100644
|
||||
--- a/posix/wordexp.c
|
||||
+++ b/posix/wordexp.c
|
||||
@@ -17,7 +17,6 @@
|
||||
@ -1500,7 +1397,7 @@ Index: b/posix/wordexp.c
|
||||
|
||||
#include <libc-lock.h>
|
||||
#include <_itoa.h>
|
||||
@@ -308,12 +308,7 @@ parse_tilde (char **word, size_t *word_l
|
||||
@@ -299,12 +299,7 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length,
|
||||
if (i == 1 + *offset)
|
||||
{
|
||||
/* Tilde appears on its own */
|
||||
@ -1513,7 +1410,7 @@ Index: b/posix/wordexp.c
|
||||
|
||||
/* POSIX.2 says ~ expands to $HOME and if HOME is unset the
|
||||
results are unspecified. We do a lookup on the uid if
|
||||
@@ -328,25 +323,38 @@ parse_tilde (char **word, size_t *word_l
|
||||
@@ -319,25 +314,38 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length,
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1559,7 +1456,7 @@ Index: b/posix/wordexp.c
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -354,13 +362,15 @@ parse_tilde (char **word, size_t *word_l
|
||||
@@ -345,13 +353,15 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length,
|
||||
/* Look up user name in database to get home directory */
|
||||
char *user = strndupa (&words[1 + *offset], i - (1 + *offset));
|
||||
struct passwd pwd, *tpwd;
|
||||
@ -1579,7 +1476,7 @@ Index: b/posix/wordexp.c
|
||||
|
||||
if (result == 0 && tpwd != NULL && pwd.pw_dir)
|
||||
*word = w_addstr (*word, word_length, max_length, pwd.pw_dir);
|
||||
@@ -372,6 +382,8 @@ parse_tilde (char **word, size_t *word_l
|
||||
@@ -363,6 +373,8 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length,
|
||||
*word = w_addstr (*word, word_length, max_length, user);
|
||||
}
|
||||
|
||||
@ -1588,8 +1485,8 @@ Index: b/posix/wordexp.c
|
||||
*offset = i - 1;
|
||||
}
|
||||
return *word ? 0 : WRDE_NOSPACE;
|
||||
Index: b/sysdeps/unix/sysv/linux/gethostid.c
|
||||
===================================================================
|
||||
diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c
|
||||
index ca0387723873aa8c..9a9346c2189acf7a 100644
|
||||
--- a/sysdeps/unix/sysv/linux/gethostid.c
|
||||
+++ b/sysdeps/unix/sysv/linux/gethostid.c
|
||||
@@ -63,13 +63,12 @@ sethostid (long int id)
|
||||
@ -1642,8 +1539,8 @@ Index: b/sysdeps/unix/sysv/linux/gethostid.c
|
||||
/* For the return value to be not exactly the IP address we do some
|
||||
bit fiddling. */
|
||||
return (int32_t) (in.s_addr << 16 | in.s_addr >> 16);
|
||||
Index: b/sysdeps/unix/sysv/linux/getlogin_r.c
|
||||
===================================================================
|
||||
diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c
|
||||
index 45c468f5a13529d8..fea3e18b1bc30ee7 100644
|
||||
--- a/sysdeps/unix/sysv/linux/getlogin_r.c
|
||||
+++ b/sysdeps/unix/sysv/linux/getlogin_r.c
|
||||
@@ -18,6 +18,7 @@
|
||||
@ -1654,7 +1551,7 @@ Index: b/sysdeps/unix/sysv/linux/getlogin_r.c
|
||||
|
||||
#define STATIC static
|
||||
static int getlogin_r_fd0 (char *name, size_t namesize);
|
||||
@@ -54,28 +55,19 @@ __getlogin_r_loginuid (char *name, size_
|
||||
@@ -54,28 +55,19 @@ __getlogin_r_loginuid (char *name, size_t namesize)
|
||||
endp == uidbuf || *endp != '\0'))
|
||||
return -1;
|
||||
|
||||
@ -1690,7 +1587,7 @@ Index: b/sysdeps/unix/sysv/linux/getlogin_r.c
|
||||
}
|
||||
|
||||
if (res != 0 || tpwd == NULL)
|
||||
@@ -95,9 +87,7 @@ __getlogin_r_loginuid (char *name, size_
|
||||
@@ -95,9 +87,7 @@ __getlogin_r_loginuid (char *name, size_t namesize)
|
||||
memcpy (name, pwd.pw_name, needed);
|
||||
|
||||
out:
|
||||
|
10
glibc.spec
10
glibc.spec
@ -1,6 +1,6 @@
|
||||
%define glibcsrcdir glibc-2.26-543-g645ac9aaf8
|
||||
%define glibcsrcdir glibc-2.26-553-gd8425e116c
|
||||
%define glibcversion 2.26.90
|
||||
%define glibcrelease 19%{?dist}
|
||||
%define glibcrelease 20%{?dist}
|
||||
# Pre-release tarballs are pulled in from git using a command that is
|
||||
# effectively:
|
||||
#
|
||||
@ -2116,6 +2116,12 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Wed Oct 11 2017 Florian Weimer <fweimer@redhat.com> - 2.26.90-20
|
||||
- Auto-sync with upstream branch master,
|
||||
commit d8425e116cdd954fea0c04c0f406179b5daebbb3:
|
||||
- nss_files performance issue in multi mode (swbz#22078)
|
||||
- Ensure C99 and C11 interfaces are available for C++ (swbz#21326)
|
||||
|
||||
* Mon Oct 09 2017 Florian Weimer <fweimer@redhat.com> - 2.26.90-19
|
||||
- Move /var/db/Makefile to nss_db (#1498900)
|
||||
- Auto-sync with upstream branch master,
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (glibc-2.26-543-g645ac9aaf8.tar.gz) = ded33961468daccde0bf155e5534e015ad092ccc4c302febed086e9966dcc2f373e3b3c9c329d8babf2e26a6f3c96ec3c9efab0a8275b84eedad2ab13db7d347
|
||||
SHA512 (glibc-2.26-553-gd8425e116c.tar.gz) = e54c68a352f02405285eedaacdc64f69be2cc221583a5ddc1ecc226eb58b4ba566f4078847c2816eaf02112245eceb53cd20aaf504300997885590afa1706824
|
||||
|
Loading…
Reference in New Issue
Block a user