aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/command_line_interface.cc
diff options
context:
space:
mode:
authorkenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2010-01-08 05:47:13 +0000
committerkenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2010-01-08 05:47:13 +0000
commitf9fa0590bc67a297b1629f957d8ca07381e3e02b (patch)
tree3d52dd52f005ed8d8f41f658af040a68583e461b /src/google/protobuf/compiler/command_line_interface.cc
parent38fcd39227f3fb220dc4ac381c1617c49a0215e3 (diff)
downloadprotobuf-f9fa0590bc67a297b1629f957d8ca07381e3e02b.tar.gz
protobuf-f9fa0590bc67a297b1629f957d8ca07381e3e02b.tar.bz2
protobuf-f9fa0590bc67a297b1629f957d8ca07381e3e02b.zip
Fix memory leak in CommandLineInterface, not that it really matters.
Diffstat (limited to 'src/google/protobuf/compiler/command_line_interface.cc')
-rw-r--r--src/google/protobuf/compiler/command_line_interface.cc14
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;