Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: chrome/common/extensions/api/extension_api.cc

Issue 10177007: Add buffer to capture crash in ExtensionAPI::LoadSchemaList (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: koz Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/common/extensions/api/extension_api.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/common/extensions/api/extension_api.h" 5 #include "chrome/common/extensions/api/extension_api.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 return unprivileged; 57 return unprivileged;
58 } 58 }
59 59
60 return false; 60 return false;
61 } 61 }
62 62
63 base::StringPiece ReadFromResource(int resource_id) { 63 base::StringPiece ReadFromResource(int resource_id) {
64 return ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id); 64 return ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id);
65 } 65 }
66 66
67 scoped_ptr<ListValue> LoadSchemaList(const base::StringPiece& schema) { 67 scoped_ptr<ListValue> LoadSchemaList(const std::string& name,
68 const base::StringPiece& schema) {
68 std::string error_message; 69 std::string error_message;
69 scoped_ptr<Value> result( 70 scoped_ptr<Value> result(
70 base::JSONReader::ReadAndReturnError( 71 base::JSONReader::ReadAndReturnError(
71 schema.as_string(), 72 schema.as_string(),
72 base::JSON_PARSE_RFC, // options 73 base::JSON_PARSE_RFC, // options
73 NULL, // error code 74 NULL, // error code
74 &error_message)); 75 &error_message));
76
77 // Tracking down http://crbug.com/121424
78 char buf[128];
79 base::snprintf(buf, arraysize(buf), "%s: (%d) '%s'",
80 name.c_str(),
81 result.get() ? result->GetType() : -1,
82 error_message.c_str());
83
75 CHECK(result.get()) << error_message << " for schema " << schema; 84 CHECK(result.get()) << error_message << " for schema " << schema;
76 CHECK(result->IsType(Value::TYPE_LIST)) << " for schema " << schema; 85 CHECK(result->IsType(Value::TYPE_LIST)) << " for schema " << schema;
77 return scoped_ptr<ListValue>(static_cast<ListValue*>(result.release())); 86 return scoped_ptr<ListValue>(static_cast<ListValue*>(result.release()));
78 } 87 }
79 88
80 DictionaryValue* FindListItem(const ListValue* list, 89 DictionaryValue* FindListItem(const ListValue* list,
81 const std::string& property_name, 90 const std::string& property_name,
82 const std::string& property_value) { 91 const std::string& property_value) {
83 for (size_t i = 0; i < list->GetSize(); ++i) { 92 for (size_t i = 0; i < list->GetSize(); ++i) {
84 DictionaryValue* item = NULL; 93 DictionaryValue* item = NULL;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 // TODO(aa): Remove this code when all API descriptions have been updated. 148 // TODO(aa): Remove this code when all API descriptions have been updated.
140 *feature_type = "api"; 149 *feature_type = "api";
141 *feature_name = full_name; 150 *feature_name = full_name;
142 return; 151 return;
143 } 152 }
144 153
145 *feature_type = full_name.substr(0, colon_index); 154 *feature_type = full_name.substr(0, colon_index);
146 *feature_name = full_name.substr(colon_index + 1); 155 *feature_name = full_name.substr(colon_index + 1);
147 } 156 }
148 157
149 void ExtensionAPI::LoadSchema(const base::StringPiece& schema) { 158 void ExtensionAPI::LoadSchema(const std::string& name,
150 scoped_ptr<ListValue> schema_list(LoadSchemaList(schema)); 159 const base::StringPiece& schema) {
160 scoped_ptr<ListValue> schema_list(LoadSchemaList(name, schema));
151 std::string schema_namespace; 161 std::string schema_namespace;
152 162
153 while (!schema_list->empty()) { 163 while (!schema_list->empty()) {
154 const DictionaryValue* schema = NULL; 164 const DictionaryValue* schema = NULL;
155 { 165 {
156 Value* value = NULL; 166 Value* value = NULL;
157 schema_list->Remove(schema_list->GetSize() - 1, &value); 167 schema_list->Remove(schema_list->GetSize() - 1, &value);
158 CHECK(value->IsType(Value::TYPE_DICTIONARY)); 168 CHECK(value->IsType(Value::TYPE_DICTIONARY));
159 schema = static_cast<const DictionaryValue*>(value); 169 schema = static_cast<const DictionaryValue*>(value);
160 } 170 }
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 SchemaMap::iterator maybe_schema = schemas_.find(api_name); 477 SchemaMap::iterator maybe_schema = schemas_.find(api_name);
468 if (maybe_schema != schemas_.end()) { 478 if (maybe_schema != schemas_.end()) {
469 result = maybe_schema->second.get(); 479 result = maybe_schema->second.get();
470 } else { 480 } else {
471 // Might not have loaded yet; or might just not exist. 481 // Might not have loaded yet; or might just not exist.
472 std::map<std::string, base::StringPiece>::iterator maybe_schema_resource = 482 std::map<std::string, base::StringPiece>::iterator maybe_schema_resource =
473 unloaded_schemas_.find(api_name); 483 unloaded_schemas_.find(api_name);
474 if (maybe_schema_resource == unloaded_schemas_.end()) 484 if (maybe_schema_resource == unloaded_schemas_.end())
475 return NULL; 485 return NULL;
476 486
477 LoadSchema(maybe_schema_resource->second); 487 LoadSchema(maybe_schema_resource->first, maybe_schema_resource->second);
478 maybe_schema = schemas_.find(api_name); 488 maybe_schema = schemas_.find(api_name);
479 CHECK(schemas_.end() != maybe_schema); 489 CHECK(schemas_.end() != maybe_schema);
480 result = maybe_schema->second.get(); 490 result = maybe_schema->second.get();
481 } 491 }
482 492
483 if (!child_name.empty()) 493 if (!child_name.empty())
484 result = GetSchemaChild(result, child_name); 494 result = GetSchemaChild(result, child_name);
485 495
486 return result; 496 return result;
487 } 497 }
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 continue; 719 continue;
710 } 720 }
711 721
712 if (i->second.MatchesURL(url)) 722 if (i->second.MatchesURL(url))
713 out->insert(i->first); 723 out->insert(i->first);
714 } 724 }
715 } 725 }
716 726
717 void ExtensionAPI::LoadAllSchemas() { 727 void ExtensionAPI::LoadAllSchemas() {
718 while (unloaded_schemas_.size()) { 728 while (unloaded_schemas_.size()) {
719 LoadSchema(unloaded_schemas_.begin()->second); 729 std::map<std::string, base::StringPiece>::iterator it =
730 unloaded_schemas_.begin();
731 LoadSchema(it->first, it->second);
720 } 732 }
721 } 733 }
722 734
723 } // namespace extensions 735 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/common/extensions/api/extension_api.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698