~ubuntu-branches/debian/squeeze/protobuf/squeeze

« back to all changes in this revision

Viewing changes to src/google/protobuf/compiler/importer.cc

  • Committer: Bazaar Package Importer
  • Author(s): Julien Cristau
  • Date: 2009-06-02 16:19:00 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090602161900-vm176i3ryt35yk91
Tags: 2.0.3-2.2
* Non-maintainer upload.
* Fix FTBFS from -2.1: don't fail when we can't clean up the java build,
  such as when openjdk isn't installed.
* Disable parallel builds, because libtool is made of fail (if binary-arch
  and build-indep run concurrently, we relink a library while it's being
  used; that doesn't work so well).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
// Protocol Buffers - Google's data interchange format
2
 
// Copyright 2008 Google Inc.
 
2
// Copyright 2008 Google Inc.  All rights reserved.
3
3
// http://code.google.com/p/protobuf/
4
4
//
5
 
// Licensed under the Apache License, Version 2.0 (the "License");
6
 
// you may not use this file except in compliance with the License.
7
 
// You may obtain a copy of the License at
8
 
//
9
 
//      http://www.apache.org/licenses/LICENSE-2.0
10
 
//
11
 
// Unless required by applicable law or agreed to in writing, software
12
 
// distributed under the License is distributed on an "AS IS" BASIS,
13
 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 
// See the License for the specific language governing permissions and
15
 
// limitations under the License.
 
5
// Redistribution and use in source and binary forms, with or without
 
6
// modification, are permitted provided that the following conditions are
 
7
// met:
 
8
//
 
9
//     * Redistributions of source code must retain the above copyright
 
10
// notice, this list of conditions and the following disclaimer.
 
11
//     * Redistributions in binary form must reproduce the above
 
12
// copyright notice, this list of conditions and the following disclaimer
 
13
// in the documentation and/or other materials provided with the
 
14
// distribution.
 
15
//     * Neither the name of Google Inc. nor the names of its
 
16
// contributors may be used to endorse or promote products derived from
 
17
// this software without specific prior written permission.
 
18
//
 
19
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
20
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
21
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 
22
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 
23
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
24
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 
25
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
26
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
27
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
28
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 
29
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16
30
 
17
31
// Author: kenton@google.com (Kenton Varda)
18
32
//  Based on original Protocol Buffers design by
47
61
#endif
48
62
#endif
49
63
 
 
64
// Returns true if the text looks like a Windows-style absolute path, starting
 
65
// with a drive letter.  Example:  "C:\foo".  TODO(kenton):  Share this with
 
66
// copy in command_line_interface.cc?
 
67
static bool IsWindowsAbsolutePath(const string& text) {
 
68
#if defined(_WIN32) || defined(__CYGWIN__)
 
69
  return text.size() >= 3 && text[1] == ':' &&
 
70
         isalpha(text[0]) &&
 
71
         (text[2] == '/' || text[2] == '\\') &&
 
72
         text.find_last_of(':') == 1;
 
73
#else
 
74
  return false;
 
75
#endif
 
76
}
 
77
 
50
78
MultiFileErrorCollector::~MultiFileErrorCollector() {}
51
79
 
52
80
// This class serves two purposes:
262
290
      // We do not allow the file name to use "..".
263
291
      return false;
264
292
    }
265
 
    if (HasPrefixString(filename, "/")) {
 
293
    if (HasPrefixString(filename, "/") ||
 
294
        IsWindowsAbsolutePath(filename)) {
266
295
      // This is an absolute path, so it isn't matched by the empty string.
267
296
      return false;
268
297
    }
280
309
      // Not an exact match.  Is the next character a '/'?  Otherwise,
281
310
      // this isn't actually a match at all.  E.g. the prefix "foo/bar"
282
311
      // does not match the filename "foo/barbaz".
 
312
      int after_prefix_start = -1;
283
313
      if (filename[old_prefix.size()] == '/') {
 
314
        after_prefix_start = old_prefix.size() + 1;
 
315
      } else if (filename[old_prefix.size() - 1] == '/') {
 
316
        // old_prefix is never empty, and canonicalized paths never have
 
317
        // consecutive '/' characters.
 
318
        after_prefix_start = old_prefix.size();
 
319
      }
 
320
      if (after_prefix_start != -1) {
284
321
        // Yep.  So the prefixes are directories and the filename is a file
285
322
        // inside them.
286
 
        string after_prefix = filename.substr(old_prefix.size() + 1);
 
323
        string after_prefix = filename.substr(after_prefix_start);
287
324
        if (ContainsParentReference(after_prefix)) {
288
325
          // We do not allow the file name to use "..".
289
326
          return false;