On 04/02, Jim Keniston wrote: > > On Mon, 2014-03-31 at 21:44 +0200, Oleg Nesterov wrote: > ... > > +/* > > + * Adjust the return address pushed by a call insn executed out of line. > > + */ > > +static int adjust_ret_addr(unsigned long sp, long correction) > > +{ > > + int rasize, ncopied; > > + long ra = 0; > > + > > + if (is_ia32_task()) > > + rasize = 4; > > + else > > + rasize = 8; > > + > > + ncopied = copy_from_user(&ra, (void __user *)sp, rasize); > > + if (unlikely(ncopied)) > > + return -EFAULT; > > + > > + ra += correction; > > + ncopied = copy_to_user((void __user *)sp, &ra, rasize); > > + if (unlikely(ncopied)) > > + return -EFAULT; > > + > > + return 0; > > +} > > This isn't your bug, Oleg -- you're just moving code -- but consider > taking this opportunity to fix it... > > "ncopied" is a misnomer here. copy_from_user() and copy_to_user() > return the number of bytes that could NOT be copied.
Yes, thanks. I'll try to cleanup this later. I am not sure yet, but perhaps I will change adjust_ret_addr() and hijack_return_addr() to use a couple of new get/put_user helpers, because ->call_emulate() needs to check is_ia32_task() and write to *sp too. Thanks. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/