Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20120618214821.GG163@brightrain.aerifal.cx>
Date: Mon, 18 Jun 2012 17:48:21 -0400
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: Silly question about strncpy(), strlen() and related funcs

On Tue, Jun 19, 2012 at 02:54:09AM +0800, orc wrote:
> Did not reached Rich privately, so I want to ask publicly:
> 
> What ALIGN and additional checks like 'if (((uintptr_t)s & ALIGN) ==
> ((uintptr_t)d & ALIGN))' {...} are mean in src/string/strpcpy.c and
> similiar functions?

Hi. Sorry I didn't get back to you earlier. I meant to but lost your
email amidst all the gnulib stuff.

The point of this test is that we want to copy larger data units at a
time (system word size) instead of single bytes if possible, but this
is only portable if the source and destination of each read and write
is properly aligned. The initial addresses don't have to be aligned as
long as their remainder modulo the alignment is the same; the initial
misaligned part can be copied byte-at-a-time, and as long as the
the source and destination misalignment initially matched, they'll
both be aligned for word-at-a-time copying after the initial segment.

Some systems, such as x86, would actually allow misaligned
reads/writes in general, but we still need to avoid them for many
functions. Why? Because a misaligned read might cross page boundaries
into an unreadable/nonexistant page, and thereby cause SIGSEGV or
SIGBUS. Reading past the end of a string is no problem as long as we
stay in the same page, so it could work on x86 if we align the source
address and just leave the destination possibly misaligned, but x86 is
about the _only_ arch where that's safe, and if we really want to take
advantage of larger-unit copies in the misaligned case, I think it
should just be done with x86 asm rather than adding special cases in
the C code. With asm, we could also use the string functions (rep
movsd etc.) which give optimal performance on most cpus.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.