lib: align source before using optimized implementation

If the source is at the boundary of the VMA, loading one word at a
time can cause an alignment fault when the adjacent VMA is IO mapped.
Do byte-by-byte copy until source aligns to 8 bytes and then continue
with optimized version.

CRs-Fixed: 973724
Change-Id: I05e085597c58169fc6e275508a907029b9c7ec64
Signed-off-by: Sanrio Alvares <salvares@codeaurora.org>
This commit is contained in:
Sanrio Alvares 2016-02-08 18:42:08 -08:00 committed by David Keitel
parent 566b301bfe
commit ae3950d623

View file

@ -14,6 +14,8 @@
(((long) dst | (long) src) & (sizeof(long) - 1))
#endif
#define CHECK_ALIGN(v, a) ((((unsigned long)(v)) & ((a) - 1)) == 0)
/*
* Do a strncpy, return length of string without final '\0'.
* 'count' is the user-supplied count (return 'count' if we
@ -35,6 +37,21 @@ static inline long do_strncpy_from_user(char *dst, const char __user *src, long
if (IS_UNALIGNED(src, dst))
goto byte_at_a_time;
/* Copy a byte at a time until we align to 8 bytes */
while (max && (!CHECK_ALIGN(src + res, 8))) {
char c;
int ret;
ret = __get_user(c, src + res);
if (ret)
return -ret;
dst[res] = c;
if (!c)
return res;
res++;
max--;
}
while (max >= sizeof(unsigned long)) {
unsigned long c, data;