diff options
author | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2010-01-08 05:47:13 +0000 |
---|---|---|
committer | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2010-01-08 05:47:13 +0000 |
commit | f9fa0590bc67a297b1629f957d8ca07381e3e02b (patch) | |
tree | 3d52dd52f005ed8d8f41f658af040a68583e461b | |
parent | 38fcd39227f3fb220dc4ac381c1617c49a0215e3 (diff) | |
download | protobuf-f9fa0590bc67a297b1629f957d8ca07381e3e02b.tar.gz protobuf-f9fa0590bc67a297b1629f957d8ca07381e3e02b.tar.bz2 protobuf-f9fa0590bc67a297b1629f957d8ca07381e3e02b.zip |
Fix memory leak in CommandLineInterface, not that it really matters.
-rw-r--r-- | src/google/protobuf/compiler/command_line_interface.cc | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc index 525dfc03..d3495ca6 100644 --- a/src/google/protobuf/compiler/command_line_interface.cc +++ b/src/google/protobuf/compiler/command_line_interface.cc @@ -607,10 +607,9 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { // that two code generators may output to the same location, in which case // they should share a single OutputDirectory (so that OpenForInsert() works). typedef hash_map<string, MemoryOutputDirectory*> OutputDirectoryMap; - OutputDirectoryMap output_directories_; + OutputDirectoryMap output_directories; // Generate output. - MemoryOutputDirectory output_directory; if (mode_ == MODE_COMPILE) { for (int i = 0; i < output_directives_.size(); i++) { string output_location = output_directives_[i].output_location; @@ -618,7 +617,7 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { !HasSuffixString(output_location, ".jar")) { AddTrailingSlash(&output_location); } - MemoryOutputDirectory** map_slot = &output_directories_[output_location]; + MemoryOutputDirectory** map_slot = &output_directories[output_location]; if (*map_slot == NULL) { // First time we've seen this output location. @@ -626,18 +625,20 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { } if (!GenerateOutput(parsed_files, output_directives_[i], *map_slot)) { + STLDeleteValues(&output_directories); return 1; } } } // Write all output to disk. - for (OutputDirectoryMap::iterator iter = output_directories_.begin(); - iter != output_directories_.end(); ++iter) { + for (OutputDirectoryMap::iterator iter = output_directories.begin(); + iter != output_directories.end(); ++iter) { const string& location = iter->first; MemoryOutputDirectory* directory = iter->second; if (HasSuffixString(location, "/")) { if (!directory->WriteAllToDisk(location)) { + STLDeleteValues(&output_directories); return 1; } } else { @@ -646,11 +647,14 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { } if (!directory->WriteAllToZip(location)) { + STLDeleteValues(&output_directories); return 1; } } } + STLDeleteValues(&output_directories); + if (!descriptor_set_name_.empty()) { if (!WriteDescriptorSet(parsed_files)) { return 1; |