Re: [PATCH 4/4] sigaltstack: allow disabling and re-enabling sas within sighandler
From: Oleg Nesterov <oleg@redhat.com>
Date: 2016-02-01 17:10:07
Also in:
linux-api
On 02/01, Oleg Nesterov wrote:
quoted
+ onsigstack = on_sig_stack(sp); + if (ss_size == 0) { + switch (ss_flags) { + case 0: + error = -EPERM; + if (onsigstack) + goto out; + current->sas_ss_sp = 0; + current->sas_ss_size = 0; + current->sas_ss_flags = SS_DISABLE; + break; + case SS_ONSTACK: + /* re-enable previously disabled sas */ + error = -EINVAL; + if (current->sas_ss_size == 0) + goto out; + break; + default: + break; + }and iiuc the "default" case allows you to write SS_DISABLE into ->sas_ss_flags even if on_sig_stack(). So the sequence is // running on alt stack sigaltstack(SS_DISABLE); temporary_run_on_another_stack(); sigaltstack(SS_ONSTACK); and SS_DISABLE saves us from another SA_ONSTACK signal, right? But afaics it can only help after we change the stack. Suppose that SA_ONSTACK signal comess before temporary_run_on_another_stack(). get_sigframe() should be fine after your changes (afaics), it won't pick the alt stack after SS_DISABLE. However, unless I missed something save_altstack_ex() will record SS_ONSTACK in uc_stack->ss_flags, and after return from signal handler restore_altstack() will enable alt stack again?
OK, I didn't notice you modified save_altstack_ex() to use ->sas_ss_flags instead of sas_ss_flags()... still doesn't look right, in this case restore_altstack() will not restore sas_ss_size/sas_ss_sp and they can be changed by signal handler. Anyway, whatever I missed I agree with Andy, SS_FORCE looks simpler and better to me. Oleg.