diff mbox series

[v4] arm64/sysreg: refactor deprecated strncpy

Message ID 20230905-strncpy-arch-arm64-v4-1-bc4b14ddfaef@google.com (mailing list archive)
State New, archived
Headers show
Series [v4] arm64/sysreg: refactor deprecated strncpy | expand

Commit Message

Justin Stitt Sept. 5, 2023, 8:10 p.m. UTC
strncpy is deprecated [1] and should not be used if the src string is
not NUL-terminated.

When dealing with `cmdline` we are counting the number of characters
until a space then copying these over into `buf`. Let's not use any of
the str*() functions since the src string is not necessarily NUL-terminated.

Prefer `memcpy()` alongside a forced NUL-termination as it more
accurately describes what is going on within this function, i.e: copying
from non NUL-terminated buffer into a NUL-terminated buffer.

Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
Link: https://github.com/KSPP/linux/issues/90
Cc: linux-hardening@vger.kernel.org
Suggested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Justin Stitt <justinstitt@google.com>
---
Changes in v4:
- rebase onto mainline (thanks Will)
- Link to v3: https://lore.kernel.org/r/20230831-strncpy-arch-arm64-v3-1-cdbb1e7ea5e1@google.com

Changes in v3:
- Fix faulty logic and use memcpy over strscpy (thanks Mostafa and Kees)
- Use '\0' instead of 0 to make it abundantly clear that `buf` is a NUL-terminated string
- Link to v2: https://lore.kernel.org/r/20230811-strncpy-arch-arm64-v2-1-ba84eabffadb@google.com

Changes in v2:
- Utilize return value from strscpy and check for truncation (thanks Kees)
- Link to v1: https://lore.kernel.org/r/20230810-strncpy-arch-arm64-v1-1-f67f3685cd64@google.com
---
 arch/arm64/kernel/idreg-override.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)


---
base-commit: 2dde18cd1d8fac735875f2e4987f11817cc0bc2c
change-id: 20230810-strncpy-arch-arm64-1f3d328bd9b8

Best regards,
--
Justin Stitt <justinstitt@google.com>

Comments

Will Deacon Sept. 6, 2023, 6:48 p.m. UTC | #1
On Tue, Sep 05, 2023 at 08:10:21PM +0000, Justin Stitt wrote:
> strncpy is deprecated [1] and should not be used if the src string is
> not NUL-terminated.
> 
> When dealing with `cmdline` we are counting the number of characters
> until a space then copying these over into `buf`. Let's not use any of
> the str*() functions since the src string is not necessarily NUL-terminated.
> 
> Prefer `memcpy()` alongside a forced NUL-termination as it more
> accurately describes what is going on within this function, i.e: copying
> from non NUL-terminated buffer into a NUL-terminated buffer.
> 
> Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
> Link: https://github.com/KSPP/linux/issues/90
> Cc: linux-hardening@vger.kernel.org
> Suggested-by: Kees Cook <keescook@chromium.org>
> Signed-off-by: Justin Stitt <justinstitt@google.com>
> ---
> Changes in v4:
> - rebase onto mainline (thanks Will)
> - Link to v3: https://lore.kernel.org/r/20230831-strncpy-arch-arm64-v3-1-cdbb1e7ea5e1@google.com

The original patch converting the strncpy() to strscpy() has already landed
upstream, so this doesn't apply as-is.

Rather than go through a v5, I've reverted your original patch and squashed
this on top with a new commit message. I'll push it out tomorrow on to the
arm64 fixes branch.

Thanks,

Will
Justin Stitt Sept. 6, 2023, 11:24 p.m. UTC | #2
On Wed, Sep 6, 2023 at 11:48 AM Will Deacon <will@kernel.org> wrote:
>
> On Tue, Sep 05, 2023 at 08:10:21PM +0000, Justin Stitt wrote:
> > strncpy is deprecated [1] and should not be used if the src string is
> > not NUL-terminated.
> >
> > When dealing with `cmdline` we are counting the number of characters
> > until a space then copying these over into `buf`. Let's not use any of
> > the str*() functions since the src string is not necessarily NUL-terminated.
> >
> > Prefer `memcpy()` alongside a forced NUL-termination as it more
> > accurately describes what is going on within this function, i.e: copying
> > from non NUL-terminated buffer into a NUL-terminated buffer.
> >
> > Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
> > Link: https://github.com/KSPP/linux/issues/90
> > Cc: linux-hardening@vger.kernel.org
> > Suggested-by: Kees Cook <keescook@chromium.org>
> > Signed-off-by: Justin Stitt <justinstitt@google.com>
> > ---
> > Changes in v4:
> > - rebase onto mainline (thanks Will)
> > - Link to v3: https://lore.kernel.org/r/20230831-strncpy-arch-arm64-v3-1-cdbb1e7ea5e1@google.com
>
> The original patch converting the strncpy() to strscpy() has already landed
> upstream, so this doesn't apply as-is.
>
> Rather than go through a v5, I've reverted your original patch and squashed
> this on top with a new commit message. I'll push it out tomorrow on to the
> arm64 fixes branch.
Thanks! Sorry I hadn't noticed it go through -- especially with all
the reviews surrounding the patches.

>
> Thanks,
>
> Will
Konrad Dybcio Sept. 7, 2023, 5:36 p.m. UTC | #3
On 5.09.2023 22:10, Justin Stitt wrote:
> strncpy is deprecated [1] and should not be used if the src string is
> not NUL-terminated.
> 
> When dealing with `cmdline` we are counting the number of characters
> until a space then copying these over into `buf`. Let's not use any of
> the str*() functions since the src string is not necessarily NUL-terminated.
> 
> Prefer `memcpy()` alongside a forced NUL-termination as it more
> accurately describes what is going on within this function, i.e: copying
> from non NUL-terminated buffer into a NUL-terminated buffer.
> 
> Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
> Link: https://github.com/KSPP/linux/issues/90
> Cc: linux-hardening@vger.kernel.org
> Suggested-by: Kees Cook <keescook@chromium.org>
> Signed-off-by: Justin Stitt <justinstitt@google.com>
> ---
Hi,

some form of this patch [1] went into -next and it broke booting
on at least the Qualcomm SC8280XP-based Lenovo Thinkpad X13S.

Konrad

[1] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?h=d232606773a0b09ec7f1ffc25f63abe801d011fd
Justin Stitt Sept. 7, 2023, 6:17 p.m. UTC | #4
On Thu, Sep 7, 2023 at 10:37 AM Konrad Dybcio <konradybcio@kernel.org> wrote:
>
>
>
> On 5.09.2023 22:10, Justin Stitt wrote:
> > strncpy is deprecated [1] and should not be used if the src string is
> > not NUL-terminated.
> >
> > When dealing with `cmdline` we are counting the number of characters
> > until a space then copying these over into `buf`. Let's not use any of
> > the str*() functions since the src string is not necessarily NUL-terminated.
> >
> > Prefer `memcpy()` alongside a forced NUL-termination as it more
> > accurately describes what is going on within this function, i.e: copying
> > from non NUL-terminated buffer into a NUL-terminated buffer.
> >
> > Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
> > Link: https://github.com/KSPP/linux/issues/90
> > Cc: linux-hardening@vger.kernel.org
> > Suggested-by: Kees Cook <keescook@chromium.org>
> > Signed-off-by: Justin Stitt <justinstitt@google.com>
> > ---
> Hi,
>
> some form of this patch [1] went into -next and it broke booting
> on at least the Qualcomm SC8280XP-based Lenovo Thinkpad X13S.
>

Thanks for the heads up! The previous versions of the patch (including
the one that was applied) had some errors. This patch should be good
and Will is looking to apply it to arm64 fixes tree.

> Konrad
>
> [1] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?h=d232606773a0b09ec7f1ffc25f63abe801d011fd
Will Deacon Sept. 8, 2023, 10:18 a.m. UTC | #5
On Thu, Sep 07, 2023 at 11:17:08AM -0700, Justin Stitt wrote:
> On Thu, Sep 7, 2023 at 10:37 AM Konrad Dybcio <konradybcio@kernel.org> wrote:
> >
> >
> >
> > On 5.09.2023 22:10, Justin Stitt wrote:
> > > strncpy is deprecated [1] and should not be used if the src string is
> > > not NUL-terminated.
> > >
> > > When dealing with `cmdline` we are counting the number of characters
> > > until a space then copying these over into `buf`. Let's not use any of
> > > the str*() functions since the src string is not necessarily NUL-terminated.
> > >
> > > Prefer `memcpy()` alongside a forced NUL-termination as it more
> > > accurately describes what is going on within this function, i.e: copying
> > > from non NUL-terminated buffer into a NUL-terminated buffer.
> > >
> > > Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
> > > Link: https://github.com/KSPP/linux/issues/90
> > > Cc: linux-hardening@vger.kernel.org
> > > Suggested-by: Kees Cook <keescook@chromium.org>
> > > Signed-off-by: Justin Stitt <justinstitt@google.com>
> > > ---
> > Hi,
> >
> > some form of this patch [1] went into -next and it broke booting
> > on at least the Qualcomm SC8280XP-based Lenovo Thinkpad X13S.
> >
> 
> Thanks for the heads up! The previous versions of the patch (including
> the one that was applied) had some errors. This patch should be good
> and Will is looking to apply it to arm64 fixes tree.

Yes, it should be fixed in linux-next 20230908.

Cheers,

Will
diff mbox series

Patch

diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c
index 2fe2491b692c..3addc09f8746 100644
--- a/arch/arm64/kernel/idreg-override.c
+++ b/arch/arm64/kernel/idreg-override.c
@@ -263,8 +263,8 @@  static __init void __parse_cmdline(const char *cmdline, bool parse_aliases)
 			return;
 
 		len = min(len, ARRAY_SIZE(buf) - 1);
-		strncpy(buf, cmdline, len);
-		buf[len] = 0;
+		memcpy(buf, cmdline, len);
+		buf[len] = '\0';
 
 		if (strcmp(buf, "--") == 0)
 			return;