On Thu, Mar 28, 2024 at 09:44:48PM +0000, Justin Stitt wrote: > strncpy() is deprecated for use on NUL-terminated destination strings > [1] and as such we should prefer more robust and less ambiguous string > interfaces. > > In cifssmb.c: > Using strncpy with a length argument equal to strlen(src) is generally > dangerous because it can cause string buffers to not be NUL-terminated. > In this case, however, there was extra effort made to ensure the buffer > was NUL-terminated via a manual NUL-byte assignment. In an effort to rid > the kernel of strncpy() use, let's swap over to using strscpy() which > guarantees NUL-termination on the destination buffer. > > To handle the case where ea_name is NULL, let's use the ?: operator to > substitute in an empty string, thereby allowing strscpy to still > NUL-terminate the destintation string. Yeah. And for the non-NULL case, namelen is 0-255. And 255 comes from strnlen() as the limit of characters, so namelen + 1 will include the NUL terminator. > Interesting note: this flex array buffer may go on to also have some > value encoded after the NUL-termination: > | if (ea_value_len) > | memcpy(parm_data->list.name + name_len + 1, > | ea_value, ea_value_len); > > Now for smb2ops.c and smb2transport.c: > Both of these cases are simple, strncpy() is used to copy string > literals which have a length less than the destination buffer's size. We > can simply swap in the new 2-argument version of strscpy() introduced in > Commit e6584c3964f2f ("string: Allow 2-argument strscpy()"). > > Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1] > Link: https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html [2] > Link: https://github.com/KSPP/linux/issues/90 > Cc: linux-hardening@xxxxxxxxxxxxxxx > Signed-off-by: Justin Stitt <justinstitt@xxxxxxxxxx> Reviewed-by: Kees Cook <keescook@xxxxxxxxxxxx> -- Kees Cook