On 26 November 2012 20:32, Rich Felker <dal...@aerifal.cx> wrote:
>
> As far as I know, there's nothing to maintain "backwards
> compatibility" with. The stat structures vary per-arch, and an arch
> that doesn't have a non-64-bit statfs syscall doesn't have an existing
> "struct statfs" to maintain backwards compatibility with. You can just
> define "struct statfs" to match the layout of the 64-bit struct.

I see what you mean but looking at the uClibc code
(include/bits/statfs.h) struct statfs is always
defined so your proposal of introducing yet another statfs for arches
that don't have the non-64bit
syscalls will conflict with this definition. It's always possible to
#if/#endif the existing statfs structure with a new one
for architectures that don't have the 32-bit version, but I don't
think this is prettier to what I've done here.
Same thing happens in the the kernel. A statfs structure is always
exported whether you can support the
32-bit syscall or not. Also existing applications expect this
well-known struct statfs. Changing it to a new one will
result in an ABI break.

>
> By the way, the old small-off_t functions are supposed to give an
> error if any off_t value does not fit in the range of off_t, rather
> than silently truncating. So even if you want to keep the conversion
> code, you need to check this. If using my approach (with same struct
> layout and padding for the extra 32 bits), you'd need to test that the
> padding is zero and return an error if any nonzero value appeared in
> the padding (except perhaps in the case of -1?).
>
>> As for the simple "buf" pointer check, I think you missed the point.
>> This pointer is never passed to the kernel
>> (it is not passed to the INLINE_SYSCALL macro) so the kernel does not
>> know about it. It is possible your userspace
>> program to pass an invalid "buf" pointer and the INLINE_SYSCALL to
>> succeed but you will crash after that when you try
>> to dereference any member of the invalid "buf" pointer.
>
> Crashing is perfectly acceptable behavior. statfs() is under no
> obligation to report EFAULT; passing an invalid pointer is undefined
> behavior and the expected result should be a crash or worse. Even if
> the kernel handles it, passing bogus pointers won't necessarily give
> EFAULT; if they happen to point to writable memory, you'll just
> clobber random memory.
>
> Rich

Well yeah, it just feels weird for your userspace application to be
able to crash your C library,
although, as you correctly pointed out, it will not handle bad
possitive pointers.
Normally the kernel would handle bad user input but in this case the
kernel has no
idea about it.

-- 
Regards,
Markos
_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to