Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hamradio: replace deprecated strncpy with strscpy_pad

strncpy() is deprecated for use on NUL-terminated destination strings
[1] and as such we should prefer more robust and less ambiguous string
interfaces.

We expect both hi.data.modename and hi.data.drivername to be
NUL-terminated based on its usage with sprintf:
| sprintf(hi.data.modename, "%sclk,%smodem,fclk=%d,bps=%d%s",
| bc->cfg.intclk ? "int" : "ext",
| bc->cfg.extmodem ? "ext" : "int", bc->cfg.fclk, bc->cfg.bps,
| bc->cfg.loopback ? ",loopback" : "");

Note that this data is copied out to userspace with:
| if (copy_to_user(data, &hi, sizeof(hi)))
... however, the data was also copied FROM the user here:
| if (copy_from_user(&hi, data, sizeof(hi)))

Considering the above, a suitable replacement is strscpy_pad() as it
guarantees NUL-termination on the destination buffer while also
NUL-padding (which is good+wanted behavior when copying data to
userspace).

Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
Link: https://github.com/KSPP/linux/issues/90
Signed-off-by: Justin Stitt <justinstitt@google.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20231016-strncpy-drivers-net-hamradio-baycom_epp-c-v2-1-39f72a72de30@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Justin Stitt and committed by
Jakub Kicinski
d4b14c1d 5294df64

+2 -2
+2 -2
drivers/net/hamradio/baycom_epp.c
··· 1074 1074 return 0; 1075 1075 1076 1076 case HDLCDRVCTL_DRIVERNAME: 1077 - strncpy(hi.data.drivername, "baycom_epp", sizeof(hi.data.drivername)); 1077 + strscpy_pad(hi.data.drivername, "baycom_epp", sizeof(hi.data.drivername)); 1078 1078 break; 1079 1079 1080 1080 case HDLCDRVCTL_GETMODE: ··· 1091 1091 return baycom_setmode(bc, hi.data.modename); 1092 1092 1093 1093 case HDLCDRVCTL_MODELIST: 1094 - strncpy(hi.data.modename, "intclk,extclk,intmodem,extmodem,divider=x", 1094 + strscpy_pad(hi.data.modename, "intclk,extclk,intmodem,extmodem,divider=x", 1095 1095 sizeof(hi.data.modename)); 1096 1096 break; 1097 1097