aboutsummaryrefslogtreecommitdiff
path: root/posix/glob.c
diff options
context:
space:
mode:
authorTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>2020-03-20 18:24:51 -0300
committerTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>2020-03-20 18:24:51 -0300
commit6869471f35da6446d5d83faf154256a2fccce9b3 (patch)
tree3d9b26cfa8b4386cd55e9436ea5b7058e190defc /posix/glob.c
parentfe5012e47407914ec1a66f8337f6adfba6c42680 (diff)
parent263e6175999bc7f5adb8b32fd12fcfae3f0bb05a (diff)
downloadglibc-ibm/2.26/master.zip
glibc-ibm/2.26/master.tar.gz
glibc-ibm/2.26/master.tar.bz2
Merge branch release/2.26/master into ibm/2.26/masteribm/2.26/master
Diffstat (limited to 'posix/glob.c')
-rw-r--r--posix/glob.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/posix/glob.c b/posix/glob.c
index b2273ea..0c6eeb3 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -947,26 +947,32 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
size_t home_len = strlen (p->pw_dir);
size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
- if (__glibc_unlikely (malloc_dirname))
- free (dirname);
- malloc_dirname = 0;
+ char *d, *newp;
+ bool use_alloca = glob_use_alloca (alloca_used,
+ home_len + rest_len + 1);
- if (glob_use_alloca (alloca_used, home_len + rest_len + 1))
- dirname = alloca_account (home_len + rest_len + 1,
- alloca_used);
+ if (use_alloca)
+ newp = alloca_account (home_len + rest_len + 1, alloca_used);
else
{
- dirname = malloc (home_len + rest_len + 1);
- if (dirname == NULL)
+ newp = malloc (home_len + rest_len + 1);
+ if (newp == NULL)
{
free (malloc_pwtmpbuf);
retval = GLOB_NOSPACE;
goto out;
}
- malloc_dirname = 1;
}
- *((char *) mempcpy (mempcpy (dirname, p->pw_dir, home_len),
- end_name, rest_len)) = '\0';
+
+ d = mempcpy (newp, p->pw_dir, home_len);
+ if (end_name != NULL)
+ d = mempcpy (d, end_name, rest_len);
+ *d = '\0';
+
+ if (__glibc_unlikely (malloc_dirname))
+ free (dirname);
+ dirname = newp;
+ malloc_dirname = !use_alloca;
dirlen = home_len + rest_len;
dirname_modified = 1;