Incorrect preadv/pwritev argument parsing on ARM EABI
Dima Kogan
dima at secretsauce.net
Thu Apr 17 09:16:31 UTC 2014
Dmitry V. Levin <ldv at altlinux.org> writes:
> On Wed, Apr 16, 2014 at 11:19:06PM -0700, Dima Kogan wrote:
>> Dima Kogan <dima at secretsauce.net> writes:
>> > Dmitry V. Levin <ldv at altlinux.org> writes:
>> >
>> OK. Never mind on the llseek, actually. I was testing lseek, NOT llseek,
>> which is why it looked odd. The patch I attached earlier can be fixed
>> with some #ifdefs probably. I should be pretty trivial. Is it useful for
>> me to do it, or do you want to?
>
> If the result is going to be as complex as printllval without alignment,
> it worth extending printllval instead of reinventing the wheel.
Currently printllval assumes register alignment, which (on ARM at least)
should be done for some syscalls (like pread) but not others (like
preadv). To make printllval work here, it'd need to take an extra
argument to indicate whether alignment should happen or not. That
function is already full of logic, so I was thinking instead something
of printing the preadv/pwritev pos like this:
#ifdef 64bit
printllval(tcp, "%llu", PREAD_OFFSET_ARG);
#else
tprintf("%llu", LONG_LONG(tcp->u_arg[3], tcp->u_arg[4]));
#endif
Here "64bit" would be replaced by something that's defined if we can
pass 64-bit args in a single register. I don't know about all the
platforms that printllval() checks, so I can't say if this "64bit" check
would be complicated or not. Looking at printllval(), it looks like it's
possible to have sizeof(long)==8, but still pass syscall args in 32-bit
pieces. Do you know the details about all the cases?
dima
More information about the Strace-devel
mailing list