commit:     d469b099b5e8aed45ff2edf78f91822b805440d3
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Wed Nov 29 15:17:47 2017 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Wed Nov 29 15:17:47 2017 +0000
URL:        https://gitweb.gentoo.org/repo/proj/prefix.git/commit/?id=d469b099

sys-devel/binutils-config: fix returned buffer from find_real_ld, bug #639172

Package-Manager: Portage-2.3.13-prefix, Repoman-2.3.4

 sys-devel/binutils-config/files/ldwrapper.c | 35 ++++++++++++++++-------------
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/sys-devel/binutils-config/files/ldwrapper.c 
b/sys-devel/binutils-config/files/ldwrapper.c
index 88f93a8602..80831a7142 100644
--- a/sys-devel/binutils-config/files/ldwrapper.c
+++ b/sys-devel/binutils-config/files/ldwrapper.c
@@ -45,8 +45,8 @@ find_real_ld(char **ld, char verbose, char *wrapper)
        FILE *f = NULL;
        char *ldoveride;
        char *path;
-#define ESIZ 1024
-       char e[ESIZ];
+#define ESIZ 1024  /* POSIX_MAX_PATH */
+       char *ret;
        struct stat lde;
 
        /* we may not succeed finding the linker */
@@ -65,6 +65,10 @@ find_real_ld(char **ld, char verbose, char *wrapper)
                fprintf(stdout, "%s: BINUTILS_CONFIG_LD not found in 
environment\n",
                                wrapper);
        
+       ret = malloc(sizeof(char) * ESIZ);
+       if (ret == NULL)
+               return;
+
        /* find ld in PATH, allowing easy PATH overrides */
        path = getenv("PATH");
        while (path > (char*)1 && *path != '\0') {
@@ -72,9 +76,9 @@ find_real_ld(char **ld, char verbose, char *wrapper)
                if (q)
                        *q = '\0';
                if (strstr(path, "/" CHOST "/binutils-bin/") != NULL) {
-                       snprintf(e, ESIZ, "%s/%s", path, wrapper);
-                       if (stat(e, &lde) == 0)
-                               *ld = e;
+                       snprintf(ret, ESIZ, "%s/%s", path, wrapper);
+                       if (stat(ret, &lde) == 0)
+                               *ld = ret;
                }
                if (q)
                        *q = ':'; /* restore PATH value */
@@ -88,7 +92,7 @@ find_real_ld(char **ld, char verbose, char *wrapper)
        /* parse EPREFIX/etc/env.d/binutils/config-CHOST to get CURRENT, then
         * consider $EPREFIX/usr/CHOST/binutils-bin/CURRENT where we should
         * be able to find ld */
-       e[0] = '\0';
+       ret[0] = '\0';
        if ((f = fopen(EPREFIX "/etc/env.d/binutils/config-" CHOST, "r")) != 
NULL) {
                char p[ESIZ];
                while (fgets(p, ESIZ, f) != NULL) {
@@ -99,25 +103,25 @@ find_real_ld(char **ld, char verbose, char *wrapper)
                                for (q--; isspace(*q); q--)
                                        *q = '\0';
                                        ;
-                               snprintf(e, ESIZ, EPREFIX "/usr/" CHOST 
"/binutils-bin/%s/%s",
+                               snprintf(ret, ESIZ, EPREFIX "/usr/" CHOST 
"/binutils-bin/%s/%s",
                                                p + strlen("CURRENT="), 
wrapper);
                                break;
                        }
                }
                fclose(f);
-               if (stat(e, &lde) == 0) {
-                       *ld = e;
+               if (stat(ret, &lde) == 0) {
+                       *ld = ret;
                        return;
                }
        }
        if (verbose)
                fprintf(stdout, "%s: linker not found via " EPREFIX
                                "/etc/env.d/binutils/config-" CHOST " 
(ld=%s)\n",
-                               wrapper, e);
+                               wrapper, ret);
        
        /* last try, call binutils-config to tell us what the linker is
         * supposed to be */
-       e[0] = '\0';
+       ret[0] = '\0';
        if ((f = popen("binutils-config -c", "r")) != NULL) {
                char p[ESIZ];
                char *q;
@@ -125,20 +129,21 @@ find_real_ld(char **ld, char verbose, char *wrapper)
                        q = p;
                        if (strncmp(q, CHOST "-", strlen(CHOST "-")) == 0)
                                q += strlen(CHOST "-");
-                       snprintf(e, ESIZ, EPREFIX "/usr/" CHOST 
"/binutils-bin/%s/%s",
+                       snprintf(ret, ESIZ, EPREFIX "/usr/" CHOST 
"/binutils-bin/%s/%s",
                                        q, wrapper);
                } else {
                        *p = '\0';
                }
                fclose(f);
-               if (*p && stat(e, &lde) == 0) {
-                       *ld = e;
+               if (*p && stat(ret, &lde) == 0) {
+                       *ld = ret;
                        return;
                }
        }
        if (verbose)
                fprintf(stdout, "%s: linker not found via binutils-config -c 
(ld=%s)\n",
-                               wrapper, e);
+                               wrapper, ret);
+       free(ret);
 }
 
 int

Reply via email to