summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2014-01-24 13:51:15 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-01-24 13:51:15 +0530
commit5d41dadf31bc8a2f9c34c40d52a442d3794e405c (patch)
tree1033a8751da91bf20f3f870374fb15fe76aa797b
parent0bad441c77fa4ff382dd3990542dcf52052b2121 (diff)
Adjust pointers to triplets in netgroup query data (BZ #16474)
The _nss_*_getnetgrent_r query populates the netgroup results in the allocated buffer and then sets the result triplet to point to strings in the buffer. This is a problem when the buffer is reallocated since the pointers to the triplet strings are no longer valid. The pointers need to be adjusted so that they now point to strings in the reallocated buffer.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS2
-rw-r--r--nscd/netgroupcache.c12
3 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f4453ec7f..1d19695a17 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-24 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ [BZ #16474]
+ * nscd/netgroupcache.c (addgetnetgrentX): Adjust triplet
+ string pointers after reallocation.
+
2014-01-24 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: Use __SH4__ and
diff --git a/NEWS b/NEWS
index f4f22a8f3e..5601403ee8 100644
--- a/NEWS
+++ b/NEWS
@@ -25,7 +25,7 @@ Version 2.19
16151, 16153, 16167, 16169, 16172, 16195, 16214, 16245, 16271, 16274,
16283, 16289, 16293, 16314, 16316, 16330, 16337, 16338, 16356, 16365,
16366, 16369, 16372, 16375, 16379, 16384, 16385, 16386, 16387, 16390,
- 16394, 16400, 16407, 16408, 16414, 16430, 16431, 16453.
+ 16394, 16400, 16407, 16408, 16414, 16430, 16431, 16453, 16474.
* Slovenian translations for glibc messages have been contributed by the
Translation Project's Slovenian team of translators.
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c
index 58234b1492..924567c3f3 100644
--- a/nscd/netgroupcache.c
+++ b/nscd/netgroupcache.c
@@ -241,7 +241,17 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
if (buflen - req->key_len - bufused < needed)
{
buflen += MAX (buflen, 2 * needed);
- buffer = xrealloc (buffer, buflen);
+ char *newbuf = xrealloc (buffer, buflen);
+ /* Adjust the pointers in the new
+ buffer. */
+ nhost = (nhost ? newbuf + (nhost - buffer)
+ : NULL);
+ nuser = (nuser ? newbuf + (nuser - buffer)
+ : NULL);
+ ndomain = (ndomain
+ ? newbuf + (ndomain - buffer)
+ : NULL);
+ buffer = newbuf;
}
nhost = memcpy (buffer + bufused,