iAvoid zero-length iowrite - sacc - sacc(omys), simple console gopher client Err bitreich.org 70 hgit clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ URL:git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ bitreich.org 70 1Log /scm/sacc/log.gph bitreich.org 70 1Files /scm/sacc/files.gph bitreich.org 70 1Refs /scm/sacc/refs.gph bitreich.org 70 1Tags /scm/sacc/tag bitreich.org 70 1LICENSE /scm/sacc/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 20a51bafd3906aa0337fe221d0981293d94370a5 /scm/sacc/commit/20a51bafd3906aa0337fe221d0981293d94370a5.gph bitreich.org 70 1parent 21d46d603a3697f04072e4c0edb0076b4a215a2e /scm/sacc/commit/21d46d603a3697f04072e4c0edb0076b4a215a2e.gph bitreich.org 70 hAuthor: Michael Forney URL:mailto:mforney@mforney.org bitreich.org 70 iDate: Tue, 19 Mar 2024 14:52:09 -0700 Err bitreich.org 70 i Err bitreich.org 70 iAvoid zero-length iowrite Err bitreich.org 70 i Err bitreich.org 70 iiowrite with bs==0 results in either a zero-length write() or Err bitreich.org 70 itls_write(). Err bitreich.org 70 i Err bitreich.org 70 iThe former is unspecified by POSIX[0]: Err bitreich.org 70 i> If nbyte is zero and the file is not a regular file, the results Err bitreich.org 70 i> are unspecified. Err bitreich.org 70 i Err bitreich.org 70 iThe latter is not explicitly disallowed by tls_write(3), but libressl Err bitreich.org 70 iimplements tls_write with a call to SSL_write, which is documented Err bitreich.org 70 ito have undefined behavior[1]: Err bitreich.org 70 i> When calling SSL_write() with num=0 bytes to be sent, the behaviour Err bitreich.org 70 i> is undefined. Err bitreich.org 70 i Err bitreich.org 70 i[0] https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html Err bitreich.org 70 i[1] https://man.openbsd.org/SSL_write.3 Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M sacc.c | 4 ++-- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 2 insertions(+), 2 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -535,10 +535,10 @@ sendselector(struct cnx *c, const char *selector) Err bitreich.org 70 i msg = p = xmalloc(ln); Err bitreich.org 70 i snprintf(msg, ln--, "%s\r\n", selector); Err bitreich.org 70 i Err bitreich.org 70 i- while ((n = iowrite(c, p, ln)) > 0) { Err bitreich.org 70 i+ while (ln && (n = iowrite(c, p, ln)) > 0) { Err bitreich.org 70 i ln -= n; Err bitreich.org 70 i p += n; Err bitreich.org 70 i- }; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i free(msg); Err bitreich.org 70 i if (n == -1) Err bitreich.org 70 .