Skip to content

Commit

Permalink
Merge pull request #3220 from embg/issue3200
Browse files Browse the repository at this point in the history
Disallow empty string as argument for --output-dir-flat and --output-dir-mirror
  • Loading branch information
embg committed Aug 1, 2022
2 parents 1b445c1 + f9f27de commit 28ceb63
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 21 deletions.
38 changes: 19 additions & 19 deletions programs/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -880,30 +880,30 @@ static const char * trimPath(const char *pathname)

static char* mallocAndJoin2Dir(const char *dir1, const char *dir2)
{
const size_t dir1Size = strlen(dir1);
const size_t dir2Size = strlen(dir2);
char *outDirBuffer, *buffer, trailingChar;

assert(dir1 != NULL && dir2 != NULL);
outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2);
CONTROL(outDirBuffer != NULL);
{ const size_t dir1Size = strlen(dir1);
const size_t dir2Size = strlen(dir2);
char *outDirBuffer, *buffer;

memcpy(outDirBuffer, dir1, dir1Size);
outDirBuffer[dir1Size] = '\0';
outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2);
CONTROL(outDirBuffer != NULL);

if (dir2[0] == '.')
return outDirBuffer;
memcpy(outDirBuffer, dir1, dir1Size);
outDirBuffer[dir1Size] = '\0';

buffer = outDirBuffer + dir1Size;
trailingChar = *(buffer - 1);
if (trailingChar != PATH_SEP) {
*buffer = PATH_SEP;
buffer++;
}
memcpy(buffer, dir2, dir2Size);
buffer[dir2Size] = '\0';
if (dir2[0] == '.')
return outDirBuffer;

return outDirBuffer;
buffer = outDirBuffer + dir1Size;
if (dir1Size > 0 && *(buffer - 1) != PATH_SEP) {
*buffer = PATH_SEP;
buffer++;
}
memcpy(buffer, dir2, dir2Size);
buffer[dir2Size] = '\0';

return outDirBuffer;
}
}

/* this function will return NULL if input srcFileName is not valid name for mirrored output path */
Expand Down
18 changes: 16 additions & 2 deletions programs/zstdcli.c
Original file line number Diff line number Diff line change
Expand Up @@ -1011,7 +1011,14 @@ int main(int argCount, const char* argv[])
if (longCommandWArg(&argument, "--stream-size=")) { streamSrcSize = readSizeTFromChar(&argument); continue; }
if (longCommandWArg(&argument, "--target-compressed-block-size=")) { targetCBlockSize = readSizeTFromChar(&argument); continue; }
if (longCommandWArg(&argument, "--size-hint=")) { srcSizeHint = readSizeTFromChar(&argument); continue; }
if (longCommandWArg(&argument, "--output-dir-flat")) { NEXT_FIELD(outDirName); continue; }
if (longCommandWArg(&argument, "--output-dir-flat")) {
NEXT_FIELD(outDirName);
if (strlen(outDirName) == 0) {
DISPLAY("error: output dir cannot be empty string (did you mean to pass '.' instead?)\n");
CLEAN_RETURN(1);
}
continue;
}
if (longCommandWArg(&argument, "--auto-threads")) {
const char* threadDefault = NULL;
NEXT_FIELD(threadDefault);
Expand All @@ -1020,7 +1027,14 @@ int main(int argCount, const char* argv[])
continue;
}
#ifdef UTIL_HAS_MIRRORFILELIST
if (longCommandWArg(&argument, "--output-dir-mirror")) { NEXT_FIELD(outMirroredDirName); continue; }
if (longCommandWArg(&argument, "--output-dir-mirror")) {
NEXT_FIELD(outMirroredDirName);
if (strlen(outMirroredDirName) == 0) {
DISPLAY("error: output dir cannot be empty string (did you mean to pass '.' instead?)\n");
CLEAN_RETURN(1);
}
continue;
}
#endif
#ifndef ZSTD_NOTRACE
if (longCommandWArg(&argument, "--trace")) { char const* traceFile; NEXT_FIELD(traceFile); TRACE_enable(traceFile); continue; }
Expand Down
7 changes: 7 additions & 0 deletions tests/cli-tests/basic/output_dir.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

println "+ zstd -r * --output-dir-mirror=\"\""
zstd -r * --output-dir-mirror="" && die "Should not allow empty output dir!"
println "+ zstd -r * --output-dir-flat=\"\""
zstd -r * --output-dir-flat="" && die "Should not allow empty output dir!"
exit 0
2 changes: 2 additions & 0 deletions tests/cli-tests/basic/output_dir.sh.stderr.exact
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
error: output dir cannot be empty string (did you mean to pass '.' instead?)
error: output dir cannot be empty string (did you mean to pass '.' instead?)
2 changes: 2 additions & 0 deletions tests/cli-tests/basic/output_dir.sh.stdout.exact
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
+ zstd -r * --output-dir-mirror=""
+ zstd -r * --output-dir-flat=""

0 comments on commit 28ceb63

Please sign in to comment.