aboutsummaryrefslogtreecommitdiffstats
path: root/cat
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2016-06-18 08:25:31 +0000
committerMartin Matuska <mm@FreeBSD.org>2016-06-18 08:25:31 +0000
commitdc919cebaf7d24f04391c32623e98c32a98e154c (patch)
treed775a2aa40c3c425f68dfcbb3beacc3b95f88736 /cat
parent8eb6639196dbcd2a7e6bb657a72046fd4445cc9f (diff)
downloadsrc-dc919cebaf7d24f04391c32623e98c32a98e154c.tar.gz
src-dc919cebaf7d24f04391c32623e98c32a98e154c.zip
Update vendor/libarchive to git d85976e7ff4a062e1de6e04dab7bb78e3344768f
Fixed vendor issues: Issue 553: Fix broken decryption for ZIP files Issue 657: Allow up to 8k for the test root directory name Issue 682: Correctly write gnutar filenames of exactly 512 bytes Issue 708: tar should fail if a named input file is missing PR 715: Fix libarchive/archive_read_support_format_mtree.c:1388:11: error: array subscript is above array bounds
Notes
Notes: svn path=/vendor/libarchive/dist/; revision=302003
Diffstat (limited to 'cat')
-rw-r--r--cat/test/main.c75
1 files changed, 49 insertions, 26 deletions
diff --git a/cat/test/main.c b/cat/test/main.c
index 319f68c774f0..0aa1deb572b3 100644
--- a/cat/test/main.c
+++ b/cat/test/main.c
@@ -2534,18 +2534,36 @@ usage(const char *program)
static char *
get_refdir(const char *d)
{
- char tried[512] = { '\0' };
- char buff[128];
- char *pwd, *p;
+ size_t tried_size, buff_size;
+ char *buff, *tried, *pwd = NULL, *p = NULL;
+
+#ifdef PATH_MAX
+ buff_size = PATH_MAX;
+#else
+ buff_size = 8192;
+#endif
+ buff = calloc(buff_size, 1);
+ if (buff == NULL) {
+ fprintf(stderr, "Unable to allocate memory\n");
+ exit(1);
+ }
+
+ /* Allocate a buffer to hold the various directories we checked. */
+ tried_size = buff_size * 2;
+ tried = calloc(tried_size, 1);
+ if (tried == NULL) {
+ fprintf(stderr, "Unable to allocate memory\n");
+ exit(1);
+ }
/* If a dir was specified, try that */
if (d != NULL) {
pwd = NULL;
- snprintf(buff, sizeof(buff), "%s", d);
+ snprintf(buff, buff_size, "%s", d);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
goto failure;
}
@@ -2559,48 +2577,48 @@ get_refdir(const char *d)
pwd[strlen(pwd) - 1] = '\0';
/* Look for a known file. */
- snprintf(buff, sizeof(buff), "%s", pwd);
+ snprintf(buff, buff_size, "%s", pwd);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
- snprintf(buff, sizeof(buff), "%s/test", pwd);
+ snprintf(buff, buff_size, "%s/test", pwd);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
#if defined(LIBRARY)
- snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY);
+ snprintf(buff, buff_size, "%s/%s/test", pwd, LIBRARY);
#else
- snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM);
+ snprintf(buff, buff_size, "%s/%s/test", pwd, PROGRAM);
#endif
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
#if defined(PROGRAM_ALIAS)
- snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM_ALIAS);
+ snprintf(buff, buff_size, "%s/%s/test", pwd, PROGRAM_ALIAS);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
#endif
if (memcmp(pwd, "/usr/obj", 8) == 0) {
- snprintf(buff, sizeof(buff), "%s", pwd + 8);
+ snprintf(buff, buff_size, "%s", pwd + 8);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
- snprintf(buff, sizeof(buff), "%s/test", pwd + 8);
+ snprintf(buff, buff_size, "%s/test", pwd + 8);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, buff, tried_size - strlen(tried) - 1);
+ strncat(tried, "\n", tried_size - strlen(tried) - 1);
}
failure:
@@ -2615,7 +2633,12 @@ failure:
success:
free(p);
free(pwd);
- return strdup(buff);
+ free(tried);
+
+ /* Copy result into a fresh buffer to reduce memory usage. */
+ p = strdup(buff);
+ free(buff);
+ return p;
}
int