[OpenAFS-devel] Kernel BUG on Linux 6.5.3

Michael Laß lass@mail.upb.de
Sat, 16 Sep 2023 14:18:39 +0200


Hi,

Thanks for the update. That sounds good!

Am Freitag, dem 15.09.2023 um 22:11 -0400 schrieb MS Vitale:
> Hi Michael,
> 
> Just a quick note to let you know that we were able to duplicate this.
> The root cause is an interaction between Linux 6.5 CONFIG_FORTIFY_SOURCE=
=y string helpers and
> a recent change in OpenAFS 1.8.10 to use strlcpy, which is now fortified =
in your kernel.
> 

Ah, I guess this is related to Linux commit df8fc4e934c12b (kbuild:
Enable -fstrict-flex-arrays=3). With that, the name field in DirEntry
is not handled as a flexible array anymore but the size of 16 is
actually enforced by strlcpy.

> OpenAFS has always managed the name string for directory entries in a ver=
y quirky but
> ultimately memory-safe way.  However, due to the new interaction des=
cribed above,
> Fortify now sees any directory entry name longer that 16 chars as a buffe=
r overrun.
> In your case, this is triggered during cache manager initialization by th=
e first cell
> in CellServDB with a cell name longer than 16 characters.
> 
> I have fixed the specific kernel BUG you reported, and was able to bring =
up a
> working cell.  However, there are several additional paths where sim=
ilar issues in "long"
> directory entry names are still present.  Therefore, I'm still worki=
ng on finding and fixing those.
> I'll let you know when I think I've fixed them all and have something in =
gerrit for you to try.

Wouldn't the following be a relatively simple fix? I briefly tested it
(only on the client side) and it seemed to behave well. But of course,
my testing here is very limited.


diff --git a/src/dir/dir.h b/src/dir/dir.h
index f5c8eef42..a6ac70510 100644
--- a/src/dir/dir.h
+++ b/src/dir/dir.h
@@ -57,7 +57,7 @@ struct DirEntry {
     char length;               /* currently unused */
     unsigned short next;
     struct MKFid fid;
-    char name[16];
+    char name[];
 };
 
 struct DirXEntry {



Best regards,
Michael