diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2018-05-19 02:39:48 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-05-28 17:12:23 +0800 |
commit | 4f7527f8e49276894751a9b100e68bc46568bb85 (patch) | |
tree | 8a6ece3bcd6d66225c94f1df33b7fd08163aba42 /src/cd.c | |
parent | memalloc: Add growstackto helper (diff) | |
download | dash-4f7527f8e49276894751a9b100e68bc46568bb85.tar.gz dash-4f7527f8e49276894751a9b100e68bc46568bb85.zip |
exec: Do not allocate stack string in padvance
Many callers of padvance immediately free the allocated string so this patch moves the stalloc call to the caller. Instead of returning the allocated string, padvance now returns the length to allocate (this may be longer than the actual string length, even including the NUL). For the case where we would previously return NULL, we now return -1. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to '')
-rw-r--r-- | src/cd.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/cd.c b/src/cd.c index a4e024d..610a4fa 100644 --- a/src/cd.c +++ b/src/cd.c @@ -98,6 +98,7 @@ cdcmd(int argc, char **argv) char c; struct stat statb; int flags; + int len; flags = cdopt(); dest = *argptr; @@ -127,9 +128,10 @@ dotdot: if (!*dest) dest = "."; path = bltinlookup("CDPATH"); - while (path) { - c = *path; - p = padvance(&path, dest); + while (p = path, (len = padvance(&path, dest)) >= 0) { + c = *p; + p = stalloc(len); + if (stat(p, &statb) >= 0 && S_ISDIR(statb.st_mode)) { if (c && c != ':') flags |= CD_PRINT; |