Re: [PATCH v2 1/3] fortify: Fix __compiletime_strlen() under UBSAN_BOUNDS_LOCAL

From: Nick Desaulniers
Date: Tue Sep 06 2022 - 22:37:04 EST


On Fri, Sep 2, 2022 at 1:43 PM Kees Cook <keescook@xxxxxxxxxxxx> wrote:
>
> Co-developed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>

That's overly generous of you!

Anyways, the disassembly LGTM and the bot also came back green.

Reviewed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
Tested-by: Android Treehugger Robot
Link: https://android-review.googlesource.com/c/kernel/common/+/2206839

Another thought, Nikita suggested that you could also compare mode 1 vs mode 3:
https://github.com/llvm/llvm-project/issues/57510#issuecomment-1235126343

That said, since mode 3 returns 0 for "unknown" I'd imagine that
wouldn't be pretty since it wouldn't be a direct comparison against
__p_size.

Thanks again for the patch!

> Signed-off-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
> Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx>
> ---
> include/linux/fortify-string.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/fortify-string.h b/include/linux/fortify-string.h
> index eed2119b23c5..07d5d1921eff 100644
> --- a/include/linux/fortify-string.h
> +++ b/include/linux/fortify-string.h
> @@ -19,7 +19,8 @@ void __write_overflow_field(size_t avail, size_t wanted) __compiletime_warning("
> unsigned char *__p = (unsigned char *)(p); \
> size_t __ret = (size_t)-1; \
> size_t __p_size = __builtin_object_size(p, 1); \
> - if (__p_size != (size_t)-1) { \
> + if (__p_size != (size_t)-1 && \
> + __builtin_constant_p(*__p)) { \
> size_t __p_len = __p_size - 1; \
> if (__builtin_constant_p(__p[__p_len]) && \
> __p[__p_len] == '\0') \
> --
> 2.34.1
>


--
Thanks,
~Nick Desaulniers