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