diff --git a/src/commands.cc b/src/commands.cc index 0baec150..f8a5a74d 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -94,7 +94,7 @@ void edit(const CommandParameters& params, Context& context) if (param_count == 0 or param_count > 3) throw wrong_argument_count(); - const String& name = parser[0]; + String name = canonicalize_filename(parse_filename(parser[0])); Buffer* buffer = nullptr; if (not force_reload) diff --git a/src/file.cc b/src/file.cc index e6f08996..807b09cd 100644 --- a/src/file.cc +++ b/src/file.cc @@ -46,6 +46,11 @@ String parse_filename(const String& filename) return result; } +String canonicalize_filename(const String& filename) +{ + return filename.replace(R"(((^|(?<=/))\./)+|[^/]+/\.\./)", ""); +} + String read_file(const String& filename) { int fd = open(parse_filename(filename).c_str(), O_RDONLY); @@ -71,9 +76,11 @@ String read_file(const String& filename) return content; } -Buffer* create_buffer_from_file(const String& filename) +Buffer* create_buffer_from_file(String filename) { - int fd = open(parse_filename(filename).c_str(), O_RDONLY); + filename = canonicalize_filename(parse_filename(filename)); + + int fd = open(filename.c_str(), O_RDONLY); if (fd == -1) { if (errno == ENOENT) diff --git a/src/file.hh b/src/file.hh index 7fa349c6..37621745 100644 --- a/src/file.hh +++ b/src/file.hh @@ -26,9 +26,10 @@ class Buffer; // parse ~/ and $env values in filename and returns the translated filename String parse_filename(const String& filename); +String canonicalize_filename(const String& filename); String read_file(const String& filename); -Buffer* create_buffer_from_file(const String& filename); +Buffer* create_buffer_from_file(String filename); void write_buffer_to_file(const Buffer& buffer, const String& filename); String find_file(const String& filename, const memoryview& paths);