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

Side by Side Diff: src/utils/SkRTConf.cpp

Issue 26373008: Fix a bug which caused crash in SkRTConfig whith string values in environment variables (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: simplify Created 7 years, 2 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 | « no previous file | 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 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkRTConf.h" 8 #include "SkRTConf.h"
9 #include "SkOSFile.h" 9 #include "SkOSFile.h"
10 10
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 206
207 static inline void str_replace(char *s, char search, char replace) { 207 static inline void str_replace(char *s, char search, char replace) {
208 for (char *ptr = s ; *ptr ; ptr++) { 208 for (char *ptr = s ; *ptr ; ptr++) {
209 if (*ptr == search) { 209 if (*ptr == search) {
210 *ptr = replace; 210 *ptr = replace;
211 } 211 }
212 } 212 }
213 } 213 }
214 214
215 template<typename T> bool SkRTConfRegistry::parse(const char *name, T* value) { 215 template<typename T> bool SkRTConfRegistry::parse(const char *name, T* value) {
216 SkString *str = NULL; 216 const char *str = NULL;
217 SkString tmp;
218 217
219 for (int i = fConfigFileKeys.count() - 1 ; i >= 0; i--) { 218 for (int i = fConfigFileKeys.count() - 1 ; i >= 0; i--) {
220 if (fConfigFileKeys[i]->equals(name)) { 219 if (fConfigFileKeys[i]->equals(name)) {
221 str = fConfigFileValues[i]; 220 str = fConfigFileValues[i]->c_str();
222 break; 221 break;
223 } 222 }
224 } 223 }
225 224
226 SkString environment_variable("skia."); 225 SkString environment_variable("skia.");
227 environment_variable.append(name); 226 environment_variable.append(name);
228 227
229 const char *environment_value = getenv(environment_variable.c_str()); 228 const char *environment_value = getenv(environment_variable.c_str());
230 if (environment_value) { 229 if (environment_value) {
231 if (NULL == str) { 230 str = environment_value;
232 str = &tmp;
233 }
234 str->set(environment_value);
235 } else { 231 } else {
236 // apparently my shell doesn't let me have environment variables that 232 // apparently my shell doesn't let me have environment variables that
237 // have periods in them, so also let the user substitute underscores. 233 // have periods in them, so also let the user substitute underscores.
238 SkString underscore_environment_variable("skia_"); 234 SkAutoTMalloc<char> underscore_name(SkStrDup(environment_variable.c_str( )));
239 char *underscore_name = SkStrDup(name); 235 str_replace(underscore_name.get(),'.','_');
240 str_replace(underscore_name,'.','_'); 236 environment_value = getenv(underscore_name.get());
241 underscore_environment_variable.append(underscore_name);
242 sk_free(underscore_name);
243 environment_value = getenv(underscore_environment_variable.c_str());
244 if (environment_value) { 237 if (environment_value) {
245 if (NULL == str) { 238 str = environment_value;
246 str = &tmp;
247 }
248 str->set(environment_value);
249 } 239 }
250 } 240 }
251 241
252 if (!str) { 242 if (!str) {
253 return false; 243 return false;
254 } 244 }
255 245
256 bool success; 246 bool success;
257 T new_value = doParse<T>(str->c_str(),&success); 247 T new_value = doParse<T>(str, &success);
258 if (success) { 248 if (success) {
259 *value = new_value; 249 *value = new_value;
260 } else { 250 } else {
261 SkDebugf("WARNING: Couldn't parse value \'%s\' for variable \'%s\'\n", s tr->c_str(), name); 251 SkDebugf("WARNING: Couldn't parse value \'%s\' for variable \'%s\'\n",
252 str, name);
262 } 253 }
263 return success; 254 return success;
264 } 255 }
265 256
266 // need to explicitly instantiate the parsing function for every config type we might have... 257 // need to explicitly instantiate the parsing function for every config type we might have...
267 258
268 template bool SkRTConfRegistry::parse(const char *name, bool *value); 259 template bool SkRTConfRegistry::parse(const char *name, bool *value);
269 template bool SkRTConfRegistry::parse(const char *name, int *value); 260 template bool SkRTConfRegistry::parse(const char *name, int *value);
270 template bool SkRTConfRegistry::parse(const char *name, unsigned int *value); 261 template bool SkRTConfRegistry::parse(const char *name, unsigned int *value);
271 template bool SkRTConfRegistry::parse(const char *name, float *value); 262 template bool SkRTConfRegistry::parse(const char *name, float *value);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 sk_setenv("skia_nonexistent_item", "132"); 312 sk_setenv("skia_nonexistent_item", "132");
322 int result = 0; 313 int result = 0;
323 registryWithoutContents.parse("nonexistent.item", &result); 314 registryWithoutContents.parse("nonexistent.item", &result);
324 SkASSERT(result == 132); 315 SkASSERT(result == 132);
325 } 316 }
326 317
327 SkRTConfRegistry::SkRTConfRegistry(bool) 318 SkRTConfRegistry::SkRTConfRegistry(bool)
328 : fConfs(100) { 319 : fConfs(100) {
329 } 320 }
330 #endif 321 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698