tracepoints: Prevent null probe from being added
Somehow tracepoint_entry_add_probe() function allows a null probe function. And, this may lead to unexpected results since the number of probe functions in an entry can be counted by checking whether a probe is null or not in the for-loop. This patch prevents a null probe from being added. In tracepoint_entry_remove_probe() function, checking probe parameter within the for-loop is moved out for code efficiency, leaving the null probe feature which removes all probe functions in the entry. Link: http://lkml.kernel.org/r/1365991995-19445-1-git-send-email-kpark3469@gmail.com Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Sahara <keun-o.park@windriver.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									d2802d0739
								
							
						
					
					
						commit
						4c69e6ea41
					
				| @ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, | ||||
| 	int nr_probes = 0; | ||||
| 	struct tracepoint_func *old, *new; | ||||
| 
 | ||||
| 	WARN_ON(!probe); | ||||
| 	if (WARN_ON(!probe)) | ||||
| 		return ERR_PTR(-EINVAL); | ||||
| 
 | ||||
| 	debug_print_probes(entry); | ||||
| 	old = entry->funcs; | ||||
| @ -152,13 +153,18 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, | ||||
| 
 | ||||
| 	debug_print_probes(entry); | ||||
| 	/* (N -> M), (N > 1, M >= 0) probes */ | ||||
| 	for (nr_probes = 0; old[nr_probes].func; nr_probes++) { | ||||
| 		if (!probe || | ||||
| 		    (old[nr_probes].func == probe && | ||||
| 		     old[nr_probes].data == data)) | ||||
| 			nr_del++; | ||||
| 	if (probe) { | ||||
| 		for (nr_probes = 0; old[nr_probes].func; nr_probes++) { | ||||
| 			if (old[nr_probes].func == probe && | ||||
| 			     old[nr_probes].data == data) | ||||
| 				nr_del++; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If probe is NULL, then nr_probes = nr_del = 0, and then the | ||||
| 	 * entire entry will be removed. | ||||
| 	 */ | ||||
| 	if (nr_probes - nr_del == 0) { | ||||
| 		/* N -> 0, (N > 1) */ | ||||
| 		entry->funcs = NULL; | ||||
| @ -173,8 +179,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, | ||||
| 		if (new == NULL) | ||||
| 			return ERR_PTR(-ENOMEM); | ||||
| 		for (i = 0; old[i].func; i++) | ||||
| 			if (probe && | ||||
| 			    (old[i].func != probe || old[i].data != data)) | ||||
| 			if (old[i].func != probe || old[i].data != data) | ||||
| 				new[j++] = old[i]; | ||||
| 		new[nr_probes - nr_del].func = NULL; | ||||
| 		entry->refcount = nr_probes - nr_del; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user