Re: e2fsprogs alignment

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07/09/2012 03:57 PM, Eric Sandeen wrote:
On 7/9/12 9:45 AM, Gordan Bobic wrote:
On 07/09/2012 03:24 PM, Eric Sandeen wrote:
On 7/8/12 1:07 AM, Jon Masters wrote:
On 07/07/2012 08:42 PM, Gordan Bobic wrote:
Can anyone confirm whether this has been fixed since the bug
was filed? Or whether there is still a risk of trashing the
file system on ARMv5/ARMv6?

https://bugzilla.redhat.com/show_bug.cgi?id=680090

I believe Eric said this was now likely fixed upstream. Have you
asked him to confirm? Let me copy him, and I'm sure he'll say
it's all fine :)

nope, sorry - well, not exactly fine.  ;)

We fixed on-disk structure alignment errors for XFS - this is a
different problem, with in-memory alignment...

These memory access problem on arm may well still exist.

It's "only" a warning about alignment though, right - I don't think
this results in any corruption etc, does it (anyway, filefrag is
read-only).

What concerns me is that the buffers are allocated as char[4096] all
over the place in e2fsprogs code files. That is inherently unsafe on
everything except x86 and ARMv7+. I wouldn't want to assume that
filefrag is the only affected program from the e2fsprogs suite,

Running xfstests&  e2fsprogs "make check" should expose any others.

Maybe. But if make check missed filefrag issues, so how far can it be trusted?

especially since the scope for trashing the file system is pretty
high.

Maybe I should know, but what happens on<  ARMv7+ ?  Memory corruption?

Essentially, yes.

You have an unaligned array being cast into a struct. You then dereference an element in that struct. Because the array wasn't aligned, the struct isn't aligned. Thus, the elements in the struct aren't aligned. So when you dereference a pointer into the struct, it'll get truncated to the word boundary, then dereferenced. So your data will be the prefixed with unexpected garbage, and you won't get the tail of the data.

This issue also affects SPARC and Itanium, IIRC, likely a lot of others, too. It's only x86 and ARMv7+ that have transparent automatic alignment fixup in hardware. Note that even on those there may be a performance penalty, and there is always a performance penalty for straddling cache lines (which is much more likely when you're not paying attention to alignment - one of the reasons why ICC has an option to align all data to a 16-byte boundary, just to make sure).

If so I'm surprised that extN doesn't fall down all over the place today.

Me too. :)
But it is possible that fsck doesn't get run on older ARMs often.

And as the comments in this bug indicate, I'm really not quite sure
what the accepted method of fixing is.

The options I can see are:

1) Detect sizeof(int) and declare the arrays as a suitable multiple
of that. int _should_ be word sized on most things AFAIK.

now I'll sound really dense, but isn't 4096 a multiple of sizeof(int)
on arm?

Sure, it is, but arrays of type foo are aligned to a size increment of foo. So the beginning of an array of char will be byte aligned since char is 1 byte.

I guess the weird char buf[4096] construct was to avoid malloc/free or something.

I wouldn't know, I didn't write it. :)

2) Check the required alignment for the arch at build time, and apply
it with "__attribute__ aligned" in every relevant instance. There's a
LOT of those, but that's what you get for using non-portable
techniques. :(

Yeah, that's nasty.  On xfs we did some #ifdef macros to add __attributes__
to a few on-disk structures for arm old ABI, but that was fairly well-
contained.

3) Add a new flag to gcc to align all arrays to a particular
boundary. Unlikely to happen. FWIW, ICC has such an option, IIRC as
it helps with performance, too, if things aren't straddling cache
lines.

I imagine there are several applications that exhibit similar
behavior?

Not many, if you are referring to other packages. I filed bugs for
most of them, but I filed against the available ARM releases (since
rawhide wasn't up to running on ARM), so they all got closed without
resolution pretty quickly. I gave up on bothering to file bugs after
that.

Sorry about that.  Obviously it's a higher priority now.

Yeah, it's understandable, but it was highly demotivating. Eventually I ended up causing confusion by filing against rawhide even though it wasn't quite applicable to ARM (well, "rawhide" for ARM was a few releases behind, at least :) just to avoid the bugzapper. There didn't seem to be a less wrong solution at the time.

Gordan
_______________________________________________
arm mailing list
arm@xxxxxxxxxxxxxxxxxxxxxxx
https://admin.fedoraproject.org/mailman/listinfo/arm



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux ARM (Vger)]     [Linux ARM]     [ARM Kernel]     [Fedora User Discussion]     [Older Fedora Users Discussion]     [Fedora Advisory Board]     [Fedora Security]     [Fedora Maintainers]     [Fedora Devel Java]     [Fedora Legacy]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Mentors]     [Fedora Package Announce]     [Fedora Package Review]     [Fedora Music]     [Fedora Packaging]     [Centos]     [Fedora SELinux]     [Coolkey]     [Yum Users]     [Tux]     [Yosemite News]     [Linux Apps]     [KDE Users]     [Fedora Tools]     [Fedora Art]     [Fedora Docs]     [Asterisk PBX]

Powered by Linux