mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 14:30:06 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
drivers/net/ipa/ipa_main.c8afc7e471a("net: ipa: separate disabling setup from modem stop")76b5fbcd6b("net: ipa: kill ipa_modem_init()") Duplicated include, drop one. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -48,7 +48,7 @@ bool syscall_user_dispatch(struct pt_regs *regs)
|
||||
* the selector is loaded by userspace.
|
||||
*/
|
||||
if (unlikely(__get_user(state, sd->selector))) {
|
||||
force_fatal_sig(SIGSEGV);
|
||||
force_exit_sig(SIGSEGV);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ bool syscall_user_dispatch(struct pt_regs *regs)
|
||||
return false;
|
||||
|
||||
if (state != SYSCALL_DISPATCH_FILTER_BLOCK) {
|
||||
force_fatal_sig(SIGSYS);
|
||||
force_exit_sig(SIGSYS);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -693,7 +693,7 @@ static int load_image_and_restore(void)
|
||||
goto Unlock;
|
||||
|
||||
error = swsusp_read(&flags);
|
||||
swsusp_close(FMODE_READ);
|
||||
swsusp_close(FMODE_READ | FMODE_EXCL);
|
||||
if (!error)
|
||||
error = hibernation_restore(flags & SF_PLATFORM_MODE);
|
||||
|
||||
@@ -983,7 +983,7 @@ static int software_resume(void)
|
||||
/* The snapshot device should not be opened while we're running */
|
||||
if (!hibernate_acquire()) {
|
||||
error = -EBUSY;
|
||||
swsusp_close(FMODE_READ);
|
||||
swsusp_close(FMODE_READ | FMODE_EXCL);
|
||||
goto Unlock;
|
||||
}
|
||||
|
||||
@@ -1018,7 +1018,7 @@ static int software_resume(void)
|
||||
pm_pr_dbg("Hibernation image not present or could not be loaded.\n");
|
||||
return error;
|
||||
Close_Finish:
|
||||
swsusp_close(FMODE_READ);
|
||||
swsusp_close(FMODE_READ | FMODE_EXCL);
|
||||
goto Finish;
|
||||
}
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,
|
||||
if (res <= 0)
|
||||
goto unlock;
|
||||
} else {
|
||||
res = PAGE_SIZE - pg_offp;
|
||||
res = PAGE_SIZE;
|
||||
}
|
||||
|
||||
if (!data_of(data->handle)) {
|
||||
|
||||
@@ -1298,6 +1298,12 @@ int do_send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p
|
||||
return ret;
|
||||
}
|
||||
|
||||
enum sig_handler {
|
||||
HANDLER_CURRENT, /* If reachable use the current handler */
|
||||
HANDLER_SIG_DFL, /* Always use SIG_DFL handler semantics */
|
||||
HANDLER_EXIT, /* Only visible as the process exit code */
|
||||
};
|
||||
|
||||
/*
|
||||
* Force a signal that the process can't ignore: if necessary
|
||||
* we unblock the signal and change any SIG_IGN to SIG_DFL.
|
||||
@@ -1310,7 +1316,8 @@ int do_send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p
|
||||
* that is why we also clear SIGNAL_UNKILLABLE.
|
||||
*/
|
||||
static int
|
||||
force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t, bool sigdfl)
|
||||
force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t,
|
||||
enum sig_handler handler)
|
||||
{
|
||||
unsigned long int flags;
|
||||
int ret, blocked, ignored;
|
||||
@@ -1321,9 +1328,10 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t, bool
|
||||
action = &t->sighand->action[sig-1];
|
||||
ignored = action->sa.sa_handler == SIG_IGN;
|
||||
blocked = sigismember(&t->blocked, sig);
|
||||
if (blocked || ignored || sigdfl) {
|
||||
if (blocked || ignored || (handler != HANDLER_CURRENT)) {
|
||||
action->sa.sa_handler = SIG_DFL;
|
||||
action->sa.sa_flags |= SA_IMMUTABLE;
|
||||
if (handler == HANDLER_EXIT)
|
||||
action->sa.sa_flags |= SA_IMMUTABLE;
|
||||
if (blocked) {
|
||||
sigdelset(&t->blocked, sig);
|
||||
recalc_sigpending_and_wake(t);
|
||||
@@ -1343,7 +1351,7 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t, bool
|
||||
|
||||
int force_sig_info(struct kernel_siginfo *info)
|
||||
{
|
||||
return force_sig_info_to_task(info, current, false);
|
||||
return force_sig_info_to_task(info, current, HANDLER_CURRENT);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1660,7 +1668,20 @@ void force_fatal_sig(int sig)
|
||||
info.si_code = SI_KERNEL;
|
||||
info.si_pid = 0;
|
||||
info.si_uid = 0;
|
||||
force_sig_info_to_task(&info, current, true);
|
||||
force_sig_info_to_task(&info, current, HANDLER_SIG_DFL);
|
||||
}
|
||||
|
||||
void force_exit_sig(int sig)
|
||||
{
|
||||
struct kernel_siginfo info;
|
||||
|
||||
clear_siginfo(&info);
|
||||
info.si_signo = sig;
|
||||
info.si_errno = 0;
|
||||
info.si_code = SI_KERNEL;
|
||||
info.si_pid = 0;
|
||||
info.si_uid = 0;
|
||||
force_sig_info_to_task(&info, current, HANDLER_EXIT);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1693,7 +1714,7 @@ int force_sig_fault_to_task(int sig, int code, void __user *addr
|
||||
info.si_flags = flags;
|
||||
info.si_isr = isr;
|
||||
#endif
|
||||
return force_sig_info_to_task(&info, t, false);
|
||||
return force_sig_info_to_task(&info, t, HANDLER_CURRENT);
|
||||
}
|
||||
|
||||
int force_sig_fault(int sig, int code, void __user *addr
|
||||
@@ -1813,7 +1834,8 @@ int force_sig_seccomp(int syscall, int reason, bool force_coredump)
|
||||
info.si_errno = reason;
|
||||
info.si_arch = syscall_get_arch(current);
|
||||
info.si_syscall = syscall;
|
||||
return force_sig_info_to_task(&info, current, force_coredump);
|
||||
return force_sig_info_to_task(&info, current,
|
||||
force_coredump ? HANDLER_EXIT : HANDLER_CURRENT);
|
||||
}
|
||||
|
||||
/* For the crazy architectures that include trap information in
|
||||
|
||||
@@ -3812,6 +3812,18 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
|
||||
iter->fmt[i] = '\0';
|
||||
trace_seq_vprintf(&iter->seq, iter->fmt, ap);
|
||||
|
||||
/*
|
||||
* If iter->seq is full, the above call no longer guarantees
|
||||
* that ap is in sync with fmt processing, and further calls
|
||||
* to va_arg() can return wrong positional arguments.
|
||||
*
|
||||
* Ensure that ap is no longer used in this case.
|
||||
*/
|
||||
if (iter->seq.full) {
|
||||
p = "";
|
||||
break;
|
||||
}
|
||||
|
||||
if (star)
|
||||
len = va_arg(ap, int);
|
||||
|
||||
@@ -6706,9 +6718,7 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
|
||||
cnt = PAGE_SIZE - 1;
|
||||
|
||||
/* reset all but tr, trace, and overruns */
|
||||
memset(&iter->seq, 0,
|
||||
sizeof(struct trace_iterator) -
|
||||
offsetof(struct trace_iterator, seq));
|
||||
memset_startat(iter, 0, seq);
|
||||
cpumask_clear(iter->started);
|
||||
trace_seq_init(&iter->seq);
|
||||
iter->pos = -1;
|
||||
|
||||
@@ -2576,28 +2576,27 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
|
||||
|
||||
/* Split the expression string at the root operator */
|
||||
if (!sep)
|
||||
goto free;
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
*sep = '\0';
|
||||
operand1_str = str;
|
||||
str = sep+1;
|
||||
|
||||
/* Binary operator requires both operands */
|
||||
if (*operand1_str == '\0' || *str == '\0')
|
||||
goto free;
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
operand_flags = 0;
|
||||
|
||||
/* LHS of string is an expression e.g. a+b in a+b+c */
|
||||
operand1 = parse_expr(hist_data, file, operand1_str, operand_flags, NULL, n_subexprs);
|
||||
if (IS_ERR(operand1)) {
|
||||
ret = PTR_ERR(operand1);
|
||||
operand1 = NULL;
|
||||
goto free;
|
||||
}
|
||||
if (IS_ERR(operand1))
|
||||
return ERR_CAST(operand1);
|
||||
|
||||
if (operand1->flags & HIST_FIELD_FL_STRING) {
|
||||
hist_err(file->tr, HIST_ERR_INVALID_STR_OPERAND, errpos(operand1_str));
|
||||
ret = -EINVAL;
|
||||
goto free;
|
||||
goto free_op1;
|
||||
}
|
||||
|
||||
/* RHS of string is another expression e.g. c in a+b+c */
|
||||
@@ -2605,13 +2604,12 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
|
||||
operand2 = parse_expr(hist_data, file, str, operand_flags, NULL, n_subexprs);
|
||||
if (IS_ERR(operand2)) {
|
||||
ret = PTR_ERR(operand2);
|
||||
operand2 = NULL;
|
||||
goto free;
|
||||
goto free_op1;
|
||||
}
|
||||
if (operand2->flags & HIST_FIELD_FL_STRING) {
|
||||
hist_err(file->tr, HIST_ERR_INVALID_STR_OPERAND, errpos(str));
|
||||
ret = -EINVAL;
|
||||
goto free;
|
||||
goto free_operands;
|
||||
}
|
||||
|
||||
switch (field_op) {
|
||||
@@ -2629,12 +2627,12 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto free;
|
||||
goto free_operands;
|
||||
}
|
||||
|
||||
ret = check_expr_operands(file->tr, operand1, operand2, &var1, &var2);
|
||||
if (ret)
|
||||
goto free;
|
||||
goto free_operands;
|
||||
|
||||
operand_flags = var1 ? var1->flags : operand1->flags;
|
||||
operand2_flags = var2 ? var2->flags : operand2->flags;
|
||||
@@ -2653,12 +2651,13 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
|
||||
expr = create_hist_field(hist_data, NULL, flags, var_name);
|
||||
if (!expr) {
|
||||
ret = -ENOMEM;
|
||||
goto free;
|
||||
goto free_operands;
|
||||
}
|
||||
|
||||
operand1->read_once = true;
|
||||
operand2->read_once = true;
|
||||
|
||||
/* The operands are now owned and free'd by 'expr' */
|
||||
expr->operands[0] = operand1;
|
||||
expr->operands[1] = operand2;
|
||||
|
||||
@@ -2669,7 +2668,7 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
|
||||
if (!divisor) {
|
||||
hist_err(file->tr, HIST_ERR_DIVISION_BY_ZERO, errpos(str));
|
||||
ret = -EDOM;
|
||||
goto free;
|
||||
goto free_expr;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2709,18 +2708,22 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
|
||||
expr->type = kstrdup_const(operand1->type, GFP_KERNEL);
|
||||
if (!expr->type) {
|
||||
ret = -ENOMEM;
|
||||
goto free;
|
||||
goto free_expr;
|
||||
}
|
||||
|
||||
expr->name = expr_str(expr, 0);
|
||||
}
|
||||
|
||||
return expr;
|
||||
free:
|
||||
destroy_hist_field(operand1, 0);
|
||||
destroy_hist_field(operand2, 0);
|
||||
destroy_hist_field(expr, 0);
|
||||
|
||||
free_operands:
|
||||
destroy_hist_field(operand2, 0);
|
||||
free_op1:
|
||||
destroy_hist_field(operand1, 0);
|
||||
return ERR_PTR(ret);
|
||||
|
||||
free_expr:
|
||||
destroy_hist_field(expr, 0);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -1313,6 +1313,7 @@ static int uprobe_perf_open(struct trace_event_call *call,
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
|
||||
tu = container_of(pos, struct trace_uprobe, tp);
|
||||
err = uprobe_apply(tu->inode, tu->offset, &tu->consumer, true);
|
||||
if (err) {
|
||||
uprobe_perf_close(call, event);
|
||||
|
||||
Reference in New Issue
Block a user