<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><div class="gmail_quote"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> +     child_pid = SAFE_FORK();<br>
> +     if (!child_pid)<br>
> +             grow_stack(stack, stack_size, stack - stack_size + UNITS(1));<br>
<br>
Why don't we allocate the stack here in the child process? That way we<br>
can also get rid of the cleanup() function.<br></blockquote><div><br></div><div class="gmail_default" style="font-size:small">Ok, that's no problem.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small"></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Also when we are at it, can we also add a second test where we mmap() a<br>
page in the space the stack is supposed to grow into i.e. do<br>
allocate_stack() then mmap() a page in the free address space and check<br>
that the child is killed by a SIGSEGV?<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">Sure, it is a strict way to verify everything goes well with MAP_GROWSDOWN:).</div></div><div class="gmail_default" style="font-size:small">And to guarantee SIGSEGV, it needs mapping into the address higher than the</div><div class="gmail_default" style="font-size:small">(void *)(stack - stack_size), because older kernel set 'stack_guard_gap' as 1 page.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">I'll try this in V5 tomorrow.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> +     SAFE_WAIT(&wstatus);<br>
> +     if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)<br>
> +             tst_res(TPASS, "Stack grows in unmapped region");<br>
> +     else if (WIFSIGNALED(wstatus))<br>
> +             tst_res(TFAIL, "Child killed by %s", tst_strsig(WTERMSIG(wstatus)));<br>
<br>
There is no point in this else if and tst_res(), the tst_strstatus() will print that info<br>
for you.<br></blockquote><div><span class="gmail_default" style="font-size:small">Agree.</span></div><div><span class="gmail_default" style="font-size:small"></span> </div></div>-- <br><div dir="ltr"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>