Check that non-binary types end with ".\r\n" - sacc - sacc(omys), simple console gopher client HTML git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ DIR Log DIR Files DIR Refs DIR Tags DIR LICENSE --- DIR commit 34fd4f17068b408353bb6ae1df3eb4a58c259e25 DIR parent cd386e712b7587740115c0fb0815a43052758ae2 HTML Author: Quentin Rameau <quinq@fifth.space> Date: Sat, 30 Jan 2021 19:44:16 +0100 Check that non-binary types end with ".\r\n" Otherwise that means that the remote end send incomplete data. Thanks to jhumphrey for spotting that! Diffstat: M sacc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) --- DIR diff --git a/sacc.c b/sacc.c @@ -599,20 +599,25 @@ cleanup: static int fetchitem(Item *item) { + char *raw, *r; int sock; if ((sock = connectto(item->host, item->port)) < 0 || sendselector(sock, item->selector) < 0) return 0; - item->raw = getrawitem(sock); + raw = getrawitem(sock); close(sock); - if (item->raw && !*item->raw) { + if (raw == NULL || !*raw) { diag("Empty response from server"); - clear(&item->raw); + clear(&raw); + } else if ((r = strrchr(raw, '.')) == NULL || strcmp(r, ".\r\n")) { + diag("Incomplete response from server"); + } else { + *r = '\0'; } - return (item->raw != NULL); + return ((item->raw = raw) != NULL); } static void