src: fix unaligned access in ucs2 string encoder
authorBen Noordhuis <info@bnoordhuis.nl>
Tue, 9 Dec 2014 14:41:35 +0000 (15:41 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Tue, 9 Dec 2014 18:15:50 +0000 (19:15 +0100)
commit535fec83ea890775c31cbe041fc19db9c4b7ff1f
tree467cf741d41790be6c2a747e3fb4367473109772
parent4efc02a582cb0f85ea43524dd80ce4953f972511
src: fix unaligned access in ucs2 string encoder

Seen with g++ 4.9.2 on x86_64 Linux: a SIGSEGV is generated when the
input to v8::String::NewFromTwoByte() is not suitably aligned.

g++ 4.9.2 emits SSE instructions for copy loops.  That requires aligned
input but that was something StringBytes::Encode() did not enforce until
now.  Make a properly aligned copy before handing off the input to V8.

We could, as an optimization, check that the pointer is aligned on a
two-byte boundary but that is technically still UB; pointers-to-char
are allowed to alias other pointers but the reverse is not true:
a pointer-to-uint16_t that aliases a pointer-to-char is in violation
of the pointer aliasing rules.

See https://code.google.com/p/v8/issues/detail?id=3694

Fixes segfaulting test simple/test-stream2-writable.

PR-URL: https://github.com/iojs/io.js/pull/127
Reviewed-by: Trevor Norris <trev.norris@gmail.com>
src/string_bytes.cc