diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 1b7db732c0b1..b3c94fbaf002 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -834,7 +834,10 @@ int trace_pid_write(struct trace_pid_list *filtered_pids,  		/* copy the current bits to the new max */  		ret = trace_pid_list_first(filtered_pids, &pid);  		while (!ret) { -			trace_pid_list_set(pid_list, pid); +			ret = trace_pid_list_set(pid_list, pid); +			if (ret < 0) +				goto out; +  			ret = trace_pid_list_next(filtered_pids, pid + 1, &pid);  			nr_pids++;  		} @@ -871,6 +874,7 @@ int trace_pid_write(struct trace_pid_list *filtered_pids,  		trace_parser_clear(&parser);  		ret = 0;  	} + out:  	trace_parser_put(&parser);  	if (ret < 0) { @@ -7209,7 +7213,7 @@ static ssize_t write_marker_to_buffer(struct trace_array *tr, const char __user  	entry = ring_buffer_event_data(event);  	entry->ip = ip; -	len = __copy_from_user_inatomic(&entry->buf, ubuf, cnt); +	len = copy_from_user_nofault(&entry->buf, ubuf, cnt);  	if (len) {  		memcpy(&entry->buf, FAULTED_STR, FAULTED_SIZE);  		cnt = FAULTED_SIZE; @@ -7306,7 +7310,7 @@ static ssize_t write_raw_marker_to_buffer(struct trace_array *tr,  	entry = ring_buffer_event_data(event); -	len = __copy_from_user_inatomic(&entry->id, ubuf, cnt); +	len = copy_from_user_nofault(&entry->id, ubuf, cnt);  	if (len) {  		entry->id = -1;  		memcpy(&entry->buf, FAULTED_STR, FAULTED_SIZE); | 
