From: Al Viro <viro@ZenIV.linux.org.uk>
To: James Hogan <james.hogan@imgtec.com>
Cc: linux-metag@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH 2/3] metag/usercopy: Zero rest of buffer from copy_from_user
Date: Tue, 4 Apr 2017 17:31:57 +0100 [thread overview]
Message-ID: <20170404163157.GO29622@ZenIV.linux.org.uk> (raw)
In-Reply-To: <aad3d0b9fb9309ca17a8cf52f3ad1c03b0b17379.1491316836.git-series.james.hogan@imgtec.com>
On Tue, Apr 04, 2017 at 03:46:51PM +0100, James Hogan wrote:
> @@ -618,7 +617,7 @@ EXPORT_SYMBOL(__copy_user);
> " GETB D1Ar1,[%1++]\n" \
> "2: SETB [%0++],D1Ar1\n", \
> "3: ADD %2,%2,#1\n" \
> - " SETB [%0++],D1Ar1\n", \
> + " ADD %0,%0,#1\n", \
Why bother incrementing dst here?
> " .long 2b,3b\n")
>
> #define __asm_copy_from_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
> @@ -626,7 +625,7 @@ EXPORT_SYMBOL(__copy_user);
> " GETW D1Ar1,[%1++]\n" \
> "2: SETW [%0++],D1Ar1\n" COPY, \
> "3: ADD %2,%2,#2\n" \
> - " SETW [%0++],D1Ar1\n" FIXUP, \
> + " ADD %0,%0,#2\n" FIXUP, \
> " .long 2b,3b\n" TENTRY)
>
> #define __asm_copy_from_user_2(to, from, ret) \
> @@ -637,7 +636,7 @@ EXPORT_SYMBOL(__copy_user);
> " GETB D1Ar1,[%1++]\n" \
> "4: SETB [%0++],D1Ar1\n", \
> "5: ADD %2,%2,#1\n" \
> - " SETB [%0++],D1Ar1\n", \
> + " ADD %0,%0,#1\n", \
> " .long 4b,5b\n")
>
> #define __asm_copy_from_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
> @@ -645,23 +644,20 @@ EXPORT_SYMBOL(__copy_user);
> " GETD D1Ar1,[%1++]\n" \
> "2: SETD [%0++],D1Ar1\n" COPY, \
> "3: ADD %2,%2,#4\n" \
> - " SETD [%0++],D1Ar1\n" FIXUP, \
> + " ADD %0,%0,#4\n" FIXUP, \
> " .long 2b,3b\n" TENTRY)
>
> #define __asm_copy_from_user_8x64(to, from, ret) \
> asm volatile ( \
> " GETL D0Ar2,D1Ar1,[%1++]\n" \
> "2: SETL [%0++],D0Ar2,D1Ar1\n" \
> "1:\n" \
> " .section .fixup,\"ax\"\n" \
> - " MOV D1Ar1,#0\n" \
> - " MOV D0Ar2,#0\n" \
> "3: ADD %2,%2,#8\n" \
> - " SETL [%0++],D0Ar2,D1Ar1\n" \
> + " ADD %0,%0,#8\n" \
> " MOVT D0Ar2,#HI(1b)\n" \
> " JUMP D0Ar2,#LO(1b)\n" \
> " .previous\n" \
Ditto for all of those, actually.
> +/*
> + * Copy from user to kernel. The return-value is the number of bytes that were
> + * inaccessible.
> + */
> +unsigned long raw_copy_from_user(void *pdst, const void __user *psrc,
> + unsigned long n)
> {
> register char *dst asm ("A0.2") = pdst;
> register const char __user *src asm ("A1.2") = psrc;
> @@ -724,7 +721,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
> __asm_copy_from_user_1(dst, src, retn);
> n--;
> if (retn)
> - goto copy_exception_bytes;
> + return retn + n;
> }
> }
Umm... What happens if psrc points to the last byte of an unmapped page,
with psrc + 1 pointing to valid data? AFAICS, you'll get GETB fail, have
retn increased to 1, n decremented by 1, then, assuming you end up in that
byte-copy loop, have GETB at src + 1 *succeed*, the value fetched fed to SETB
at dst + 1, n decremented again, non-zero retn finally spotted and n + retn
returned, reporting that you've copied a single byte. Which you certainly
have, but it's pdst[1] = psrc[1], not pdst[0] = psrc[0].
IOW, you need to check retn after all __asm_copy_from_user_{1,2} in the
beginning.
As for topic branch for #1 and #2 - sure, perfectly fine by me. Just give
me the branch name and I'll pull. But I think the scenario above needs to
be dealt with...
next prev parent reply other threads:[~2017-04-04 16:32 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-04 14:46 [PATCH 0/3] metag/usercopy: Support RAW_COPY_USER James Hogan
2017-04-04 14:46 ` [PATCH 1/3] metag/usercopy: Drop unused macros James Hogan
2017-04-04 14:46 ` [PATCH 2/3] metag/usercopy: Zero rest of buffer from copy_from_user James Hogan
2017-04-04 16:31 ` Al Viro [this message]
2017-04-05 6:54 ` James Hogan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170404163157.GO29622@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=james.hogan@imgtec.com \
--cc=linux-metag@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).