On Tue, Mar 19, 2024 at 07:23:43PM -0700, Kees Cook wrote: > Hm, this actually fixes potential over-reads and potential memory content > exposures (in the face of malicious/weird hardware) since p_buf_len > appears to always be sizeof(p_buf) in callers, which means the old use > of strncpy() could have left the string unterminated. > > In practice I would assume it's not a problem, but, for example, here's > a place where the 254 p_buf_len could run out when doing the sprintf: > > #define VPD_TMP_BUF_SIZE 254 > ... > #define INQUIRY_VPD_DEVICE_IDENTIFIER_LEN 254 > ... > struct t10_vpd { > unsigned char device_identifier[INQUIRY_VPD_DEVICE_IDENTIFIER_LEN]; > ... > }; > ... > int transport_dump_vpd_ident(..., unsigned char *p_buf, int p_buf_len) > { > ... > unsigned char buf[VPD_TMP_BUF_SIZE]; > ... > snprintf(buf, sizeof(buf), > "T10 VPD ASCII Device Identifier: %s\n", > &vpd->device_identifier[0]); > ... > if (p_buf) > strncpy(p_buf, buf, p_buf_len); // may write 254 chars and no NUL Wait, no, it's safe; I got confused by the double buffers. The snprintf() will always NUL-terminate, so "buf" copied into p_buf will always be NUL terminated. So, nevermind! Regardless, still a good conversion. Thank you! -Kees -- Kees Cook