Message ID | 20220902204351.2521805-2-keescook@chromium.org (mailing list archive) |
---|---|
State | Mainlined |
Commit | d07c0acb4f41cc42a0d97530946965b3e4fa68c1 |
Headers | show |
Series | Fix FORTIFY=y UBSAN_LOCAL_BOUNDS=y | expand |
On Fri, Sep 2, 2022 at 1:43 PM Kees Cook <keescook@chromium.org> wrote: > > Co-developed-by: Nick Desaulniers <ndesaulniers@google.com> That's overly generous of you! Anyways, the disassembly LGTM and the bot also came back green. Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> 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@google.com> > Signed-off-by: Kees Cook <keescook@chromium.org> > --- > 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 >
On Tue, Sep 06, 2022 at 07:36:46PM -0700, Nick Desaulniers wrote: > On Fri, Sep 2, 2022 at 1:43 PM Kees Cook <keescook@chromium.org> wrote: > > > > Co-developed-by: Nick Desaulniers <ndesaulniers@google.com> > > That's overly generous of you! Well, it was a lot of work to track down, and you wrote it up that way, I just moved things around a little bit. :) > Anyways, the disassembly LGTM and the bot also came back green. > > Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> > Tested-by: Android Treehugger Robot > Link: https://android-review.googlesource.com/c/kernel/common/+/2206839 Thank you! > Another thought, Nikita suggested that you could also compare mode 1 vs mode 3: > https://github.com/llvm/llvm-project/issues/57510#issuecomment-1235126343 Yeah, it could work (I tried this as well), but I think the better approach is checking index 0. > 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. Yeah -- it is a little weird. I might come back to this if we get more glitches like this in the future.
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') \