diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index 484ee9d1f7aadfbc65a80cfcbaba478ca07efd1d..2712374dcdc5fbb61b7287ec35ce5134c5288e8d 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -2268,7 +2268,7 @@ change_settings(int connected) for (j = 0; audio_output_types[j].name != NULL; j++) { if (xpbeep_sound_devices_enabled & audio_output_types[j].bit) { if (audio_opts[0]) - strcat(audio_opts, ", "); + strlcat(audio_opts, ", ", sizeof(audio_opts)); strcat(audio_opts, audio_output_types[j].name); } } @@ -2789,10 +2789,7 @@ load_bbslist(struct bbslist **list, /* Web lists */ if (settings.webgets) { char cache_path[MAX_PATH + 1]; - if (get_syncterm_filename(cache_path, sizeof(cache_path), SYNCTERM_PATH_CACHE, false)) { - backslash(cache_path); - strlcat(cache_path, "syncterm-system-cache", sizeof(cache_path)); - mkpath(cache_path); + if (get_syncterm_filename(cache_path, sizeof(cache_path), SYNCTERM_PATH_SYSTEM_CACHE, false)) { backslash(cache_path); for (size_t i = 0; settings.webgets[i]; i++) { char *lpath; diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index 035332998b44cd0956bbf496bf574b28f36f3d7e..a1e1091686221680fb314ff7361220f53545216e 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -1453,7 +1453,8 @@ get_syncterm_filename(char *fn, int fnlen, int type, bool shared) return NULL; backslash(fn); strlcat(fn, "syncterm-system-cache", fnlen); - mkpath(fn); + if (mkpath(fn) != 0) + return NULL; return fn; } memset(fn, 0, fnlen); @@ -1600,7 +1601,7 @@ update_webget_progress(struct webget_request *reqs, size_t items, bool leaveup) bool errors = false; for (size_t i = 0; i < items; i++) { - if (sz < pos) + if (sz <= pos) break; assert_pthread_mutex_lock(&reqs[i].mtx); if (reqs[i].msg) { @@ -1608,7 +1609,7 @@ update_webget_progress(struct webget_request *reqs, size_t items, bool leaveup) helpbuf[pos] = 0; errors = true; } - if (reqs[i].cb_data & UINT64_C(0x8000000000000000)) { + else if (reqs[i].cb_data & UINT64_C(0x8000000000000000)) { helpbuf[pos++] = '`'; helpbuf[pos] = 0; errors = true; diff --git a/src/syncterm/term.c b/src/syncterm/term.c index 25d6b4e89c1b76f909a411dc29dda5e24cdc9901..06456eeabe27bbf4670c53ed3a0a9162efb8d443 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -3730,6 +3730,7 @@ apc_handler(char *strbuf, size_t slen, char *retbuf, size_t retsize, void *apcd) return; off = flength(fn); switch (off) { + case 10240: case 4096: case 3584: case 2048: diff --git a/src/syncterm/webget.c b/src/syncterm/webget.c index 6d7012693264ff97ec2288c53329cb4d804383a6..54fad953509ad2cc18cd29b1fa5cf6f165e4f2ed 100644 --- a/src/syncterm/webget.c +++ b/src/syncterm/webget.c @@ -97,7 +97,7 @@ set_msgf(struct webget_request *req, const char *newmsgf, ...) } static ssize_t -recv_nbytes(struct http_session *sess, uint8_t *buf, size_t chunk_size, bool *eof) +recv_nbytes(struct http_session *sess, uint8_t *buf, const size_t chunk_size, bool *eof) { ssize_t received = 0; @@ -324,11 +324,15 @@ recv_line(struct http_session *sess, int timeout, size_t *len) ret = newret; } } - ret[retpos--] = 0; - if (crcount) { - if (ret[retpos] != '\r') { - set_msg(sess->req, "CR not last character in line."); - goto error_return; + if (retpos == 0) + ret[retpos] = 0; + else { + ret[retpos--] = 0; + if (crcount) { + if (ret[retpos] != '\r') { + set_msg(sess->req, "CR not last character in line."); + goto error_return; + } } } if (len) @@ -526,7 +530,8 @@ parse_cache_control(struct http_session *sess, const char *val) sz = end - val; else sz = sep - val; - if (sz == 7 && strnicmp(val, "max-age=", 8) == 0) { + // The sep check is for Coverity... + if (sz == 7 && strnicmp(val, "max-age=", 8) == 0 && sep) { errno = 0; long long ll = strtoll(&sep[0], NULL, 10); if (ll != 0 || errno == 0) { @@ -973,7 +978,10 @@ tls_setup(struct http_session *sess) goto error_return; } int off = 1; - setsockopt(sess->sock, IPPROTO_TCP, TCP_NODELAY, (char *)&off, sizeof(off)); + if (setsockopt(sess->sock, IPPROTO_TCP, TCP_NODELAY, (char *)&off, sizeof(off)) == -1) { + set_msgf(sess->req, "setsockopt() failed (%d)", SOCKET_ERRNO); + goto error_return; + } status = cryptSetAttribute(sess->tls, CRYPT_SESSINFO_NETWORKSOCKET, sess->sock); if (cryptStatusError(status)) { set_msgf(sess->req, "Unable To Set Socket (%d)", status); @@ -1115,6 +1123,7 @@ is_fresh(struct http_session *sess) int len = asprintf(&path, "%s/%s.lst", sess->req->cache_root, sess->req->name); if (len > 0) remove(path); + free(path); } return false; } diff --git a/src/xpdev/named_str_list.c b/src/xpdev/named_str_list.c index 0d676f3c4a1be4eb2ccededfefaf76321565925c..1067215628da9c576db8b3e6a3fcd02e93ffba43 100644 --- a/src/xpdev/named_str_list.c +++ b/src/xpdev/named_str_list.c @@ -49,6 +49,8 @@ namedStrListDelete(named_string_t ***list, size_t index) named_string_t **newlist; COUNT_LIST_ITEMS(*list, count); + if (count == 0) + return false; if (index == NAMED_STR_LIST_LAST_INDEX) index = count - 1; if (index >= count)