Skip to contentSkip to conversation

wireguard: noise: Add __nonstring annotations for unterminated strings

PATCH In review Kees Cook 2 participants 3 messages Mar 10, 2025 – Mar 11, 2025

Subsystems (4)
lore
Share & tools
lore

Kees Cook

author
#0 lore raw

PATCH 1/1 wireguard: noise: Add __nonstring annotations for unterminated strings

When a character array without a terminating NUL character has a static initializer, GCC 15's -Wunterminated-string-initialization will only warn if the array lacks the "nonstring" attribute[1]. Mark the arrays with __nonstring to and correctly identify the char array as "not a C string" and thereby eliminate the warning.

Cc Jason A. Donenfeld <[email protected]>
Cc "Jason A. Donenfeld" <[email protected]>
Cc Andrew Lunn <[email protected]>
Cc "David S. Miller" <[email protected]>
Cc Eric Dumazet <[email protected]>
Cc Jakub Kicinski <[email protected]>
Cc Paolo Abeni <[email protected]>
---
 drivers/net/wireguard/noise.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireguard/noise.c +2 -2
index 202a33af5a72..7eb9a23a3d4d 100644
@@ -25,8 +25,8 @@
  * <- e, ee, se, psk, {}
  */
 
-static const u8 handshake_name[37] = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s";
-static const u8 identifier_name[34] = "WireGuard v1 zx2c4 [email protected]";
+static const u8 handshake_name[37] __nonstring = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s";
+static const u8 identifier_name[34] __nonstring = "WireGuard v1 zx2c4 [email protected]";
 static u8 handshake_init_hash[NOISE_HASH_LEN] __ro_after_init;
 static u8 handshake_init_chaining_key[NOISE_HASH_LEN] __ro_after_init;
 static atomic64_t keypair_counter = ATOMIC64_INIT(0);
Signature · 1 line
2.34.1
maintainer
#1 lore raw
Quoted 5 lines · On Mon, 10 Mar 2025 15:22:50 -0700 Kees Cook wrote:

When a character array without a terminating NUL character has a static initializer, GCC 15's -Wunterminated-string-initialization will only warn if the array lacks the "nonstring" attribute[1]. Mark the arrays with __nonstring to and correctly identify the char array as "not a C string" and thereby eliminate the warning.

Hi! Would marking all of u8 as non-string not be an option? How many of such warnings do we have in the tree? Feel free to point me to a previous conversation.

author
#2 lore raw
Quoted 10 lines · Jakub Kicinski
Quoted 5 lines · On Mon, 10 Mar 2025 15:22:50 -0700 Kees Cook wrote:

When a character array without a terminating NUL character has a static initializer, GCC 15's -Wunterminated-string-initialization will only warn if the array lacks the "nonstring" attribute[1]. Mark the arrays with __nonstring to and correctly identify the char array as "not a C string" and thereby eliminate the warning.

Hi! Would marking all of u8 as non-string not be an option? How many of such warnings do we have in the tree? Feel free to point me to a previous conversation.

*thread merge*

On Mon, Mar 10, 2025 at 06:38:01PM -0400, James Bottomley wrote[1]:

Quoted 3 lines

This looks a bit suboptimal ... is there anywhere in the kernel u8[] is actually used for real strings? In which case it would seem the better place to put the annotation is in the typedef for u8 arrays.

So both of you asked basically same question, and I think the simple answer is "no we can't mark u8 as nonstring". The use of u8 has become synonymous with "char" for a long while now, and it's gotten even more common after we made char unsigned by default.

The number of warning sources is pretty small. I think I have identified and proposed fixes most of them already[2]. ACPICA needs an upstream change, which I've submitted[3]. And ACPI needed multidimensional nonstring annotation support, which had the last needed bit added to GCC today[4], and I've proposed support for it in the kernel[5]. With 4 and 5 ready, I can send the final patch, which is basically just this (and actually accounts for the vast majority of warnings emitted):

-static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst = { +static const char table_sigs[][ACPI_NAMESEG_SIZE] __nonstring_array __initconst = {

-Kees

[1] https://lore.kernel.org/lkml/98ca3727d65a418e403b03f6b17341dbcb192764.camel@HansenPartnership.com/
[2] https://lore.kernel.org/lkml/?q=f%3AKees+%22-Wunterminated-string-initialization%22
[3] https://github.com/acpica/acpica/pull/1006
[4] https://github.com/gcc-mirror/gcc/commit/afb46540d3921e96c4cd7ba8fa2c8b0901759455
[5] https://lore.kernel.org/lkml/[email protected]/

Signature · 1 line
Kees Cook