aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler/importer.cc
diff options
context:
space:
mode:
authorGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2008-12-02 05:59:15 +0000
committerGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2008-12-02 05:59:15 +0000
commit2f669cbe75c054851234b7789342a5650ef951a5 (patch)
tree942580b700e524a01ee01276af4f09c270676197 /src/google/protobuf/compiler/importer.cc
parenteb241fadf22bd9cafa3c2b2e91a914a12df07993 (diff)
* Avoid using pushd/popd in generate_descriptor_proto.sh because they are
bash-only features, and /bin/sh is not a symlink to bash on all systems. * If an input file is a Windows absolute path (e.g. "C:\foo\bar.proto") and the import path only contains "." (or contains "." but does not contain the file), protoc incorrectly thought that the file was under ".", because it thought that the path was relative (since it didn't start with a slash). This has been fixed.
Diffstat (limited to 'src/google/protobuf/compiler/importer.cc')
-rw-r--r--src/google/protobuf/compiler/importer.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/google/protobuf/compiler/importer.cc b/src/google/protobuf/compiler/importer.cc
index a0d8164a..30e106e8 100644
--- a/src/google/protobuf/compiler/importer.cc
+++ b/src/google/protobuf/compiler/importer.cc
@@ -61,6 +61,20 @@ namespace compiler {
#endif
#endif
+// Returns true if the text looks like a Windows-style absolute path, starting
+// with a drive letter. Example: "C:\foo". TODO(kenton): Share this with
+// copy in command_line_interface.cc?
+static bool IsWindowsAbsolutePath(const string& text) {
+#if defined(_WIN32) || defined(__CYGWIN__)
+ return text.size() >= 3 && text[1] == ':' &&
+ isalpha(text[0]) &&
+ (text[2] == '/' || text[2] == '\\') &&
+ text.find_last_of(':') == 1;
+#else
+ return false;
+#endif
+}
+
MultiFileErrorCollector::~MultiFileErrorCollector() {}
// This class serves two purposes:
@@ -276,7 +290,8 @@ static bool ApplyMapping(const string& filename,
// We do not allow the file name to use "..".
return false;
}
- if (HasPrefixString(filename, "/")) {
+ if (HasPrefixString(filename, "/") ||
+ IsWindowsAbsolutePath(filename)) {
// This is an absolute path, so it isn't matched by the empty string.
return false;
}