On Wednesday, April 8, 2015, Bill Spitzak <<a href="mailto:spitzak@gmail.com">spitzak@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 04/07/2015 05:03 PM, Bryce Harrington wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'm sure this is not going to ever be a problem since tty filenames and<br>
paths are on the short side, but since the tty string is an input<br>
parameter to this routine, it would be better defensive programming to<br>
use strncpy.<br>
</blockquote>
<br>
strncpy is not a fix and should never be used.<br>
<br>
That is because the proper invocation is:<br>
<br>
        strncpy(dest, len-1, src); dest[len-1] = 0;<br>
<br>
This is almost always done incorrectly, and even when correct it is hard to read and it wastes time filling the buffer with 0 when only the first 0 needs to be written.<br>
<br>
The best solution is to use strlcpy.<br>
<br>
If politics make that impossible, use snprintf(dest, len, "%s", src) which is exactly the same as strlcpy, including the return value! (imagine that...)<br>
</blockquote><div><br></div><div>It's not the politics, it's that silently truncating a filename you're hoping to use will at best pick a non-existent file, and at worst pick a totally different/unrelated file.</div><div><br></div><div>Unless truncation is explicitly acceptable (indicative/non-authoritative strings in UI), strlcpy and other silently-truncating copies are actively harmful, and a potential security risk.</div><div><br></div><div>To be honest though, I'd prefer the library entrypoint existed so the intention was clear, making it easier to audit for and spot this horrendous anti-pattern.<span></span></div><div><br></div><div>Cheers,</div>Daniel