Incorrect preadv/pwritev argument parsing on ARM EABI

Dima Kogan dima at
Thu Apr 17 09:16:31 UTC 2014

Dmitry V. Levin <ldv at> writes:

> On Wed, Apr 16, 2014 at 11:19:06PM -0700, Dima Kogan wrote:
>> Dima Kogan <dima at> writes:
>> > Dmitry V. Levin <ldv at> 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);
 tprintf("%llu", LONG_LONG(tcp->u_arg[3], tcp->u_arg[4]));

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?


More information about the Strace-devel mailing list