]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/glibc/glibc-rh809602.patch
Merge branch 'kernel-update' of ssh://git.ipfire.org/pub/git/ipfire-2.x into kernel...
[ipfire-2.x.git] / src / patches / glibc / glibc-rh809602.patch
diff --git a/src/patches/glibc/glibc-rh809602.patch b/src/patches/glibc/glibc-rh809602.patch
new file mode 100644 (file)
index 0000000..81aa63a
--- /dev/null
@@ -0,0 +1,47 @@
+diff -rup a/nscd/nscd_getserv_r.c b/nscd/nscd_getserv_r.c
+--- a/nscd/nscd_getserv_r.c    2012-04-04 16:37:27.873951850 -0600
++++ b/nscd/nscd_getserv_r.c    2012-04-04 16:37:49.904837348 -0600
+@@ -124,6 +123,7 @@ nscd_getserv_r (const char *crit, size_t
+         s_name = (char *) (&found->data[0].servdata + 1);
+         serv_resp = found->data[0].servdata;
+         s_proto = s_name + serv_resp.s_name_len;
++        alloca_aliases_len = 1;
+         aliases_len = (uint32_t *) (s_proto + serv_resp.s_proto_len);
+         aliases_list = ((char *) aliases_len
+                         + serv_resp.s_aliases_cnt * sizeof (uint32_t));
+@@ -154,7 +154,9 @@ nscd_getserv_r (const char *crit, size_t
+                                    + (serv_resp.s_aliases_cnt
+                                       * sizeof (uint32_t)));
+             if (alloca_aliases_len)
+-              tmp = __alloca (serv_resp.s_aliases_cnt * sizeof (uint32_t));
++              tmp = alloca_account (serv_resp.s_aliases_cnt
++                                    * sizeof (uint32_t),
++                                    alloca_used);
+             else
+               {
+                 tmp = malloc (serv_resp.s_aliases_cnt * sizeof (uint32_t));
+@@ -249,8 +251,9 @@ nscd_getserv_r (const char *crit, size_t
+                                    + (serv_resp.s_aliases_cnt
+                                       * sizeof (uint32_t)));
+             if (alloca_aliases_len)
+-              aliases_len = alloca (serv_resp.s_aliases_cnt
+-                                    * sizeof (uint32_t));
++              aliases_len = alloca_account (serv_resp.s_aliases_cnt
++                                            * sizeof (uint32_t),
++                                            alloca_used);
+             else
+               {
+                 aliases_len = malloc (serv_resp.s_aliases_cnt
+@@ -368,7 +371,11 @@ nscd_getserv_r (const char *crit, size_t
+       }
+       if (retval != -1)
+-      goto retry;
++      {
++        if (!alloca_aliases_len)
++          free ((void *) aliases_len);
++        goto retry;
++      }
+     }
+   if (!alloca_aliases_len)