Never remove items from cmdline_conf.
We should treat cmdline_conf as const, so we can call read_config_options() more than once with prefix = NULL.
This commit is contained in:
		
							parent
							
								
									68a20876d0
								
							
						
					
					
						commit
						4591e96c76
					
				
					 1 changed files with 14 additions and 16 deletions
				
			
		
							
								
								
									
										30
									
								
								src/conf.c
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								src/conf.c
									
										
									
									
									
								
							|  | @ -339,33 +339,31 @@ bool read_config_file(splay_tree_t *config_tree, const char *fname) { | |||
| } | ||||
| 
 | ||||
| void read_config_options(splay_tree_t *config_tree, const char *prefix) { | ||||
| 	list_node_t *node, *next; | ||||
| 	size_t prefix_len = prefix ? strlen(prefix) : 0; | ||||
| 
 | ||||
| 	for(node = cmdline_conf->tail; node; node = next) { | ||||
| 		config_t *orig_cfg, *cfg = (config_t *)node->data; | ||||
| 		next = node->prev; | ||||
| 	for(const list_node_t *node = cmdline_conf->tail; node; node = node->prev) { | ||||
| 		const config_t *cfg = node->data; | ||||
| 		config_t *new; | ||||
| 
 | ||||
| 		if(!prefix) { | ||||
| 			if(strchr(cfg->variable, '.')) | ||||
| 				continue; | ||||
| 			node->data = NULL; | ||||
| 			list_unlink_node(cmdline_conf, node); | ||||
| 		} else { | ||||
| 			if(strncmp(prefix, cfg->variable, prefix_len) || | ||||
| 			   cfg->variable[prefix_len] != '.') | ||||
| 				continue; | ||||
| 			/* Because host configuration is parsed again when
 | ||||
| 			   reconnecting, nodes must not be freed when a prefix | ||||
| 			   is given. */ | ||||
| 			orig_cfg = cfg; | ||||
| 			cfg = new_config(); | ||||
| 			cfg->variable = xstrdup(orig_cfg->variable + prefix_len + 1); | ||||
| 			cfg->value = xstrdup(orig_cfg->value); | ||||
| 			cfg->file = NULL; | ||||
| 			cfg->line = orig_cfg->line; | ||||
| 		} | ||||
| 		config_add(config_tree, cfg); | ||||
| 
 | ||||
| 		new = new_config(); | ||||
| 		if(prefix) | ||||
| 			new->variable = xstrdup(cfg->variable + prefix_len + 1); | ||||
| 		else | ||||
| 			new->variable = xstrdup(cfg->variable); | ||||
| 		new->value = xstrdup(cfg->value); | ||||
| 		new->file = NULL; | ||||
| 		new->line = cfg->line; | ||||
| 
 | ||||
| 		config_add(config_tree, new); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue