Expand build_path() function to handle empty dir arguments gracefully

When passing an empty string as a directory, the function would produce
filenames starting with a slash even when the given file_name is not an absolute
path. Defaulting to the root directory is likely never intended and might
conveivably be dangerous. The middle "/" is now skipped also if dir is an empty
string.
This commit is contained in:
Christian Kreibich 2022-05-13 14:18:22 -07:00
parent 4d1b9f4a08
commit 9d59a48ae2
3 changed files with 14 additions and 7 deletions

View file

@ -28,11 +28,13 @@ function extract_path(input: string): string
## file_name: the name of the file. ## file_name: the name of the file.
## ##
## Returns: the concatenation of the directory path and file name, or just ## Returns: the concatenation of the directory path and file name, or just
## the file name if it's already an absolute path. ## the file name if it's already an absolute path or dir is empty.
function build_path(dir: string, file_name: string): string function build_path(dir: string, file_name: string): string
{ {
return (file_name == absolute_path_pat) ? # Avoid introducing "//" into the result:
file_name : cat(dir, "/", file_name); local sep = ends_with(dir, "/") ? "" : "/";
return (file_name == absolute_path_pat || dir == "") ?
file_name : cat(dir, sep, file_name);
} }
## Returns a compressed path to a file given a directory and file name. ## Returns a compressed path to a file given a directory and file name.

View file

@ -79,7 +79,10 @@ test build_path_compressed()
/usr/local/bro/share/bro/somefile.zeek /usr/local/bro/share/bro/somefile.zeek
/usr/local/bro/somefile.zeek /usr/local/bro/somefile.zeek
=============================== ===============================
test build_full_path() test build_path()
=============================== ===============================
/home/bro//policy/somefile.zeek /home/bro/policy/somefile.zeek
/usr/local/bro/share/bro/somefile.zeek /usr/local/bro/share/bro/somefile.zeek
policy/somefile.zeek
/usr/local/bro/share/bro/somefile.zeek
/policy/somefile.zeek

View file

@ -50,8 +50,10 @@ print build_path_compressed("/home/bro/", "/usr/local/bro/share/bro/somefile.zee
print build_path_compressed("/home/bro/", "/usr/local/bro/share/../../bro/somefile.zeek"); print build_path_compressed("/home/bro/", "/usr/local/bro/share/../../bro/somefile.zeek");
print "==============================="; print "===============================";
print "test build_full_path()"; print "test build_path()";
print "==============================="; print "===============================";
print build_path("/home/bro/", "policy/somefile.zeek"); print build_path("/home/bro/", "policy/somefile.zeek");
print build_path("/home/bro/", "/usr/local/bro/share/bro/somefile.zeek"); print build_path("/home/bro/", "/usr/local/bro/share/bro/somefile.zeek");
print build_path("", "policy/somefile.zeek");
print build_path("", "/usr/local/bro/share/bro/somefile.zeek");
print build_path("/", "policy/somefile.zeek");