Subj : New Defects reported by Coverity Scan for Synchronet To : All From : scan-admin@coverity.com Date : Sun Oct 05 2025 16:13:51 ----==_mimepart_68e2993ee711b_9d27f2d5dd76db9a859454 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi, Please find the latest report on new defect(s) introduced to Synchronet found with Coverity Scan. 18 new defect(s) introduced to Synchronet found with Coverity Scan. New defect(s) Reported-by: Coverity Scan Showing 18 of 18 defect(s) ** CID 631146: Program hangs (LOCK) _____________________________________________________________________________________________ *** CID 631146: Program hangs (LOCK) /userdat.c: 4189 in loginAttemptListCount() 4183 long loginAttemptListCount(link_list_t* list) 4184 { 4185 long count; 4186 4187 if (!listLock(list)) 4188 return -1; >>> CID 631146: Program hangs (LOCK) >>> "listCountNodes" locks "list->mutex" while it is locked. 4189 count = listCountNodes(list); 4190 listUnlock(list); 4191 return count; 4192 } 4193 4194 /****************************************************************************/ ** CID 631145: Program hangs (SLEEP) _____________________________________________________________________________________________ *** CID 631145: Program hangs (SLEEP) /userdat.c: 4358 in loginBanned() 4352 listUnlock(list); 4353 if (node == NULL) 4354 return 0; 4355 attempt = node->data; 4356 SAFECOPY(name, attempt->user); 4357 truncstr(name, "@"); >>> CID 631145: Program hangs (SLEEP) >>> Call to "trashcan" might sleep while holding lock "list->mutex". 4358 if (((settings.tempban_threshold && (attempt->count - attempt->dupes) >= settings.tempban_threshold) 4359 || trashcan(cfg, name, "name")) && now < (time32_t)(attempt->time + settings.tempban_duration)) { 4360 if (details != NULL) 4361 *details = *attempt; 4362 return settings.tempban_duration - (now - attempt->time); 4363 } ** CID 631144: Program hangs (LOCK) _____________________________________________________________________________________________ *** CID 631144: Program hangs (LOCK) /sbbscon.c: 654 in client_on() 648 { 649 if (on) { 650 if (update) { 651 list_node_t* node; 652 653 listLock(&client_list); >>> CID 631144: Program hangs (LOCK) >>> "listFindNode" locks "client_list.mutex" while it is locked. 654 if ((node = listFindTaggedNode(&client_list, sock)) != NULL) 655 memcpy(node->data, client, sizeof(client_t)); 656 listUnlock(&client_list); 657 } else { 658 served++; 659 listAddNodeData(&client_list, client, sizeof(client_t), sock, LAST_NODE); ** CID 631143: (SLEEP) /mailsrvr.c: 1225 in pop3_client_thread() _____________________________________________________________________________________________ *** CID 631143: (SLEEP) /mailsrvr.c: 1241 in pop3_client_thread() 1235 1236 srand((unsigned int)(time(NULL) ^ (time_t)GetCurrentThreadId())); /* seed random number generator */ 1237 (void)rand(); /* throw-away first result */ 1238 safe_snprintf(challenge, sizeof(challenge), "<%x%x%lx%lx@%.128s>" 1239 , rand(), socket, (ulong)time(NULL), (ulong)clock(), server_host_name()); 1240 >>> CID 631143: (SLEEP) >>> Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex". 1241 sockprintf(socket, client.protocol, session, "+OK Synchronet %s Server %s%c-%s Ready %s" 1242 , client.protocol, VERSION, REVISION, PLATFORM_DESC, challenge); 1243 1244 /* Requires USER or APOP command first */ 1245 for (i = 5; i; i--) { 1246 if (!sockgetrsp(socket, client.protocol, session, NULL, buf, sizeof(buf))) /mailsrvr.c: 1225 in pop3_client_thread() 1219 client_on(socket, &client, FALSE /* update */); 1220 1221 if (startup->login_attempt.throttle 1222 && (login_attempts = loginAttempts(startup->login_attempt_list, &pop3->client_addr)) > 1) { 1223 lprintf(LOG_DEBUG, "%04d %-5s [%s] Throttling suspicious connection (%lu login attempts)" 1224 , socket, client.protocol, host_ip, login_attempts); >>> CID 631143: (SLEEP) >>> Call to "nanosleep" might sleep while holding lock "startup->login_attempt_list->mutex". 1225 mswait(login_attempts * startup->login_attempt.throttle); 1226 } 1227 1228 mail = NULL; 1229 1230 do { /mailsrvr.c: 1189 in pop3_client_thread() 1183 ulong banned = loginBanned(&scfg, startup->login_attempt_list, socket, host_name, startup->login_attempt, &attempted); 1184 if (banned) { 1185 char ban_duration[128]; 1186 lprintf(LOG_NOTICE, "%04d %-5s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s" 1187 , socket, client.protocol, host_ip, attempted.count - attempted.dupes, attempted.user 1188 , duration_estimate_to_vstr(banned, ban_duration, sizeof ban_duration, 1, 1)); >>> CID 631143: (SLEEP) >>> Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex". 1189 sockprintf(socket, client.protocol, session, "-ERR Access denied."); 1190 return false; 1191 } 1192 struct trash trash; 1193 if (trashcan2(&scfg, host_ip, NULL, "ip", &trash)) { 1194 if (!trash.quiet) { /mailsrvr.c: 1323 in pop3_client_thread() 1317 if ((p = strstr(username, NO_SPAM)) != NULL) { 1318 *p = 0; 1319 lm_mode = LM_NOSPAM; 1320 } else 1321 lm_mode = 0; 1322 if (!apop) { >>> CID 631143: (SLEEP) >>> Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex". 1323 sockprintf(socket, client.protocol, session, "+OK"); 1324 if (!sockgetrsp(socket, client.protocol, session, "PASS ", buf, sizeof(buf))) { 1325 sockprintf(socket, client.protocol, session, "-ERR PASS command expected"); 1326 break; 1327 } 1328 p = buf + 5; /mailsrvr.c: 1325 in pop3_client_thread() 1319 lm_mode = LM_NOSPAM; 1320 } else 1321 lm_mode = 0; 1322 if (!apop) { 1323 sockprintf(socket, client.protocol, session, "+OK"); 1324 if (!sockgetrsp(socket, client.protocol, session, "PASS ", buf, sizeof(buf))) { >>> CID 631143: (SLEEP) >>> Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex". 1325 sockprintf(socket, client.protocol, session, "-ERR PASS command expected"); 1326 break; 1327 } 1328 p = buf + 5; 1329 SKIP_WHITESPACE(p); 1330 SAFECOPY(password, p); /mailsrvr.c: 1193 in pop3_client_thread() 1187 , socket, client.protocol, host_ip, attempted.count - attempted.dupes, attempted.user 1188 , duration_estimate_to_vstr(banned, ban_duration, sizeof ban_duration, 1, 1)); 1189 sockprintf(socket, client.protocol, session, "-ERR Access denied."); 1190 return false; 1191 } 1192 struct trash trash; >>> CID 631143: (SLEEP) >>> Call to "trashcan2" might sleep while holding lock "startup->login_attempt_list->mutex". 1193 if (trashcan2(&scfg, host_ip, NULL, "ip", &trash)) { 1194 if (!trash.quiet) { 1195 char details[128]; 1196 lprintf(LOG_NOTICE, "%04d %-5s [%s] !CLIENT BLOCKED in ip.can %s", socket, client.protocol, host_ip, trash_details(&trash, details, sizeof details)); 1197 } 1198 sockprintf(socket, client.protocol, session, "-ERR Access denied."); /mailsrvr.c: 1201 in pop3_client_thread() 1195 char details[128]; 1196 lprintf(LOG_NOTICE, "%04d %-5s [%s] !CLIENT BLOCKED in ip.can %s", socket, client.protocol, host_ip, trash_details(&trash, details, sizeof details)); 1197 } 1198 sockprintf(socket, client.protocol, session, "-ERR Access denied."); 1199 return false; 1200 } >>> CID 631143: (SLEEP) >>> Call to "trashcan2" might sleep while holding lock "startup->login_attempt_list->mutex". 1201 if (trashcan2(&scfg, host_name, NULL, "host", &trash)) { 1202 if (!trash.quiet) { 1203 char details[128]; 1204 lprintf(LOG_NOTICE, "%04d %-5s [%s] !CLIENT BLOCKED in host.can: %s %s" 1205 , socket, client.protocol, host_ip, host_name, trash_details(&trash, details, sizeof details)); 1206 } ** CID 631142: Null pointer dereferences (FORWARD_NULL) _____________________________________________________________________________________________ *** CID 631142: Null pointer dereferences (FORWARD_NULL) /un_qwk.cpp: 380 in sbbs_t::unpack_qwk(char *, unsigned int)() 374 iniFreeStringList(voting); 375 376 strListFree(&msg_filters.ip_can); 377 strListFree(&msg_filters.host_can); 378 strListFree(&msg_filters.subject_can); 379 strListFree(&msg_filters.twit_list); >>> CID 631142: Null pointer dereferences (FORWARD_NULL) >>> Passing "&user_list" to "listFree", which dereferences null "user_list.sem". 380 listFree(&user_list); 381 382 delfiles(cfg.temp_dir, "*.NDX"); 383 SAFEPRINTF(str, "%sMESSAGES.DAT", cfg.temp_dir); 384 removecase(str); 385 SAFEPRINTF(str, "%sDOOR.ID", cfg.temp_dir); ** CID 631141: Program hangs (LOCK) _____________________________________________________________________________________________ *** CID 631141: Program hangs (LOCK) /userdat.c: 4264 in loginSuccess() 4258 list_node_t* node; 4259 4260 if (addr->addr.sa_family != AF_INET && addr->addr.sa_family != AF_INET6) 4261 return; 4262 listLock(list); 4263 if ((node = login_attempted(list, addr)) != NULL) >>> CID 631141: Program hangs (LOCK) >>> "listRemoveNode" locks "list->mutex" while it is locked. 4264 listRemoveNode(list, node, /* freeData: */ true); 4265 listUnlock(list); 4266 } 4267 4268 /****************************************************************************/ 4269 /* Returns number of *unique* login attempts (excludes consecutive dupes) */ ** CID 631140: (LOCK) /userdat.c: 4206 in loginAttemptListClear() _____________________________________________________________________________________________ *** CID 631140: (LOCK) /userdat.c: 4204 in loginAttemptListClear() 4198 long loginAttemptListClear(link_list_t* list) 4199 { 4200 long count; 4201 4202 if (!listLock(list)) 4203 return -1; >>> CID 631140: (LOCK) >>> "listCountNodes" locks "list->mutex" while it is locked. 4204 count = listCountNodes(list); 4205 count -= listFreeNodes(list); 4206 listUnlock(list); 4207 return count; 4208 } 4209 /userdat.c: 4206 in loginAttemptListClear() 4200 long count; 4201 4202 if (!listLock(list)) 4203 return -1; 4204 count = listCountNodes(list); 4205 count -= listFreeNodes(list); >>> CID 631140: (LOCK) >>> "listUnlock" unlocks "list->mutex" while it is unlocked. 4206 listUnlock(list); 4207 return count; 4208 } 4209 4210 /****************************************************************************/ 4211 static list_node_t* login_attempted(link_list_t* list, const union xp_sockaddr* addr) ** CID 631139: Program hangs (SLEEP) /services.c: 1619 in native_service_thread() _____________________________________________________________________________________________ *** CID 631139: Program hangs (SLEEP) /services.c: 1619 in native_service_thread() 1613 client_on(socket, &client, false /* update */); 1614 1615 if (startup->login_attempt.throttle 1616 && (login_attempts = loginAttempts(startup->login_attempt_list, &service_client.addr)) > 1) { 1617 lprintf(LOG_DEBUG, "%04d %s Throttling suspicious connection from: %s (%lu login attempts)" 1618 , socket, service->protocol, client.addr, login_attempts); >>> CID 631139: Program hangs (SLEEP) >>> Call to "nanosleep" might sleep while holding lock "startup->login_attempt_list->mutex". 1619 mswait(login_attempts * startup->login_attempt.throttle); 1620 } 1621 1622 /* RUN SCRIPT */ 1623 if (strpbrk(service->cmd, "/\\") == NULL) 1624 SAFEPRINTF2(cmd, "%s%s", scfg.exec_dir, service->cmd); ** CID 631138: Program hangs (LOCK) /services.c: 1651 in native_service_thread() _____________________________________________________________________________________________ *** CID 631138: Program hangs (LOCK) /services.c: 1651 in native_service_thread() 1645 lprintf(LOG_INFO, "%04d %s service thread terminated (%lu clients remain, %lu total, %lu served)" 1646 , socket, service->protocol, remain, active_clients(), service->served); 1647 1648 client_off(socket); 1649 close_socket(socket); 1650 closesocket(socket_dup); /* close duplicate handle */ >>> CID 631138: Program hangs (LOCK) >>> Returning without unlocking "startup->login_attempt_list->mutex". 1651 } 1652 1653 1654 void services_terminate(void) 1655 { 1656 uint32_t i; ** CID 631137: Program hangs (ORDER_REVERSAL) _____________________________________________________________________________________________ *** CID 631137: Program hangs (ORDER_REVERSAL) /websrvr.c: 6965 in http_session_thread() 6959 */ 6960 session.req.method = HTTP_GET; 6961 session.http_ver = HTTP_1_0; 6962 if (startup->max_clients && client_count > startup->max_clients) { 6963 lprintf(LOG_WARNING, "%04d %-5s [%s] !MAXIMUM CLIENTS (%u) exceeded by %u, access denied" 6964 , socket, session.client.protocol, session.host_ip, startup->max_clients, client_count - startup->max_clients); >>> CID 631137: Program hangs (ORDER_REVERSAL) >>> Calling "send_error" acquires lock "jsrt_mutex" while holding lock "link_list.mutex" (count: 1 / 5). 6965 send_error(&session, __LINE__, error_503); 6966 session.finished = true; 6967 } else { 6968 uint connections = listCountMatches(¤t_connections, session.host_ip, strlen(session.host_ip) + 1); 6969 if (startup->max_concurrent_connections > 0 && connections > startup->max_concurrent_connections 6970 && !is_host_exempt(&scfg, session.host_ip, /* host_name */ NULL)) { ** CID 631136: (LOCK) /mqtt.c: 842 in mqtt_client_on() _____________________________________________________________________________________________ *** CID 631136: (LOCK) /mqtt.c: 842 in mqtt_client_on() 836 for (list_node_t* node = mqtt->client_list.first; node != NULL; node = node->next) { 837 client_t* client = node->data; 838 format_client_info(str, sizeof(str), node->tag, client, client->time); 839 strListPush(&list, str); 840 client_count++; 841 } >>> CID 631136: (LOCK) >>> "listUnlock" unlocks "mqtt->client_list.mutex" while it is unlocked. 842 listUnlock(&mqtt->client_list); 843 char* buf = NULL; 844 if (client_count > 0) { 845 size_t buflen = client_count * MAX_CLIENT_STRLEN * 2; 846 buf = malloc(buflen); 847 strListJoin(list, buf, buflen, "\n"); /mqtt.c: 814 in mqtt_client_on() 808 809 listLock(&mqtt->client_list); 810 if (on) { 811 if (update) { 812 list_node_t* node; 813 >>> CID 631136: (LOCK) >>> "listFindNode" locks "mqtt->client_list.mutex" while it is locked. 814 if ((node = listFindTaggedNode(&mqtt->client_list, sock)) != NULL) { 815 memcpy(node->data, client, sizeof(client_t)); 816 format_client_info(str, sizeof(str), sock, client, time(NULL)); 817 mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/update", str); 818 } 819 } else { /mqtt.c: 825 in mqtt_client_on() 819 } else { 820 listAddNodeData(&mqtt->client_list, client, sizeof(client_t), sock, LAST_NODE); 821 format_client_info(str, sizeof(str), sock, client, client->time); 822 mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/connect", str); 823 } 824 } else { >>> CID 631136: (LOCK) >>> "listRemoveTaggedNode" locks "mqtt->client_list.mutex" while it is locked. 825 client = listRemoveTaggedNode(&mqtt->client_list, sock, /* free_data: */ false); 826 if (client != NULL) { 827 format_client_info(str, sizeof(str), sock, client, time(NULL)); 828 mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/disconnect", str); 829 FREE_AND_NULL(client); 830 } /mqtt.c: 820 in mqtt_client_on() 814 if ((node = listFindTaggedNode(&mqtt->client_list, sock)) != NULL) { 815 memcpy(node->data, client, sizeof(client_t)); 816 format_client_info(str, sizeof(str), sock, client, time(NULL)); 817 mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/update", str); 818 } 819 } else { >>> CID 631136: (LOCK) >>> "listAddNodeData" locks "mqtt->client_list.mutex" while it is locked. 820 listAddNodeData(&mqtt->client_list, client, sizeof(client_t), sock, LAST_NODE); 821 format_client_info(str, sizeof(str), sock, client, client->time); 822 mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/connect", str); 823 } 824 } else { 825 client = listRemoveTaggedNode(&mqtt->client_list, sock, /* free_data: */ false); ** CID 631135: Uninitialized variables (UNINIT) /tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695 in iniReadEncryptedFile() _____________________________________________________________________________________________ *** CID 631135: Uninitialized variables (UNINIT) /tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695 in iniReadEncryptedFile() 3689 *ks = keySize; 3690 if (saltBuf && saltsz && *saltsz) { 3691 size_t cp = *saltsz; 3692 if (cp < saltLength) 3693 cp = saltLength; 3694 if (cp) >>> CID 631135: Uninitialized variables (UNINIT) >>> Using uninitialized value "*salt" when calling "memcpy". [Note: The source code implementation of the function has been overridden by a builtin model.] 3695 memcpy(saltBuf, salt, cp); 3696 if (cp < *saltsz) 3697 saltBuf[cp] = 0; 3698 } 3699 if (saltsz) 3700 *saltsz = saltLength; ** CID 631134: Program hangs (LOCK) /mailsrvr.c: 1190 in pop3_client_thread() _____________________________________________________________________________________________ *** CID 631134: Program hangs (LOCK) /mailsrvr.c: 1190 in pop3_client_thread() 1184 if (banned) { 1185 char ban_duration[128]; 1186 lprintf(LOG_NOTICE, "%04d %-5s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s" 1187 , socket, client.protocol, host_ip, attempted.count - attempted.dupes, attempted.user 1188 , duration_estimate_to_vstr(banned, ban_duration, sizeof ban_duration, 1, 1)); 1189 sockprintf(socket, client.protocol, session, "-ERR Access denied."); >>> CID 631134: Program hangs (LOCK) >>> Returning without unlocking "startup->login_attempt_list->mutex". 1190 return false; 1191 } 1192 struct trash trash; 1193 if (trashcan2(&scfg, host_ip, NULL, "ip", &trash)) { 1194 if (!trash.quiet) { 1195 char details[128]; ** CID 631133: Program hangs (LOCK) _____________________________________________________________________________________________ *** CID 631133: Program hangs (LOCK) /userdat.c: 4303 in loginFailure() 4297 if (pass != NULL) 4298 SAFECOPY(attempt->pass, pass); 4299 attempt->count++; 4300 count = attempt->count - attempt->dupes; 4301 if (node == NULL) { 4302 attempt->first = attempt->time; >>> CID 631133: Program hangs (LOCK) >>> "listAddNodeData" locks "list->mutex" while it is locked. 4303 listPushNodeData(list, attempt, sizeof(login_attempt_t)); 4304 } 4305 listUnlock(list); 4306 4307 if (details != NULL) 4308 *details = *attempt; ** CID 631132: Control flow issues (NO_EFFECT) /tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3630 in iniReadEncryptedFile() _____________________________________________________________________________________________ *** CID 631132: Control flow issues (NO_EFFECT) /tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3630 in iniReadEncryptedFile() 3624 buffer = malloc(bufferSize); 3625 if (buffer == NULL) 3626 goto done; 3627 size_t lines = 0; 3628 while(!feof(fp)) { 3629 size_t rret = fread(buffer, 1, bufferSize, fp); >>> CID 631132: Control flow issues (NO_EFFECT) >>> This less-than-zero comparison of an unsigned value is never true. "rret < 0UL". 3630 if (rret < 0 || rret > INT_MAX) 3631 goto done; 3632 if ((streamCipher && rret > 0) || rret == bufferSize) { 3633 size_t bufpos = 0; 3634 status = cryptDecrypt(ctx, buffer, rret); 3635 if (cryptStatusError(status)) ** CID 631131: (SLEEP) /websrvr.c: 6948 in http_session_thread() _____________________________________________________________________________________________ *** CID 631131: (SLEEP) /websrvr.c: 6911 in http_session_thread() 6905 } 6906 6907 login_attempt_t attempted; 6908 ulong banned = loginBanned(&scfg, startup->login_attempt_list, session.socket, host_name, startup->login_attempt, &attempted); 6909 6910 /* host_ip wasn't defined in http_session_thread */ >>> CID 631131: (SLEEP) >>> Call to "trashcan2" might sleep while holding lock "startup->login_attempt_list->mutex". 6911 if (banned || trashcan2(&scfg, session.host_ip, NULL, "ip", &trash)) { 6912 if (banned) { 6913 char ban_duration[128]; 6914 lprintf(LOG_NOTICE, "%04d %-5s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s" 6915 , session.socket, session.client.protocol 6916 , session.host_ip, attempted.count - attempted.dupes, attempted.user /websrvr.c: 7055 in http_session_thread() 7049 } 7050 /* At this point, if redirp is non-NULL then the headers have already been parsed */ 7051 if ((session.http_ver < HTTP_1_0) || redirp != NULL || parse_headers(&session)) { 7052 if (check_request(&session)) { 7053 if (session.req.send_location < MOVED_TEMP || session.req.virtual_path[0] != '/' || loop_count++ >= MAX_REDIR_LOOPS) { 7054 if (read_post_data(&session)) >>> CID 631131: (SLEEP) >>> Call to "respond" might sleep while holding lock "startup->login_attempt_list->mutex". 7055 respond(&session); 7056 } 7057 else { 7058 if (!session.redir_req[0]) { 7059 safe_snprintf(session.redir_req, sizeof(session.redir_req), "%s %s%s%s", methods[session.req.method] 7060 , session.req.virtual_path, session.http_ver < HTTP_1_0?"":" ", http_vers[session.http_ver]); /websrvr.c: 6948 in http_session_thread() 6942 client_on(session.socket, &session.client, /* update existing client record? */ false); 6943 6944 if (startup->login_attempt.throttle 6945 && (login_attempts = loginAttempts(startup->login_attempt_list, &session.addr)) > 1) { 6946 lprintf(LOG_DEBUG, "%04d %-5s [%s] Throttling suspicious connection (%lu login attempts)" 6947 , socket, session.client.protocol, session.host_ip, login_attempts); >>> CID 631131: (SLEEP) >>> Call to "nanosleep" might sleep while holding lock "startup->login_attempt_list->mutex". 6948 mswait(login_attempts * startup->login_attempt.throttle); 6949 } 6950 6951 session.last_user_num = -1; 6952 session.last_js_user_num = -1; 6953 session.logon_time = 0; ** CID 631130: Null pointer dereferences (FORWARD_NULL) _____________________________________________________________________________________________ *** CID 631130: Null pointer dereferences (FORWARD_NULL) /un_rep.cpp: 538 in sbbs_t::unpack_rep(char *)() 532 iniFreeStringList(voting); 533 534 strListFree(&msg_filters.ip_can); 535 strListFree(&msg_filters.host_can); 536 strListFree(&msg_filters.subject_can); 537 strListFree(&msg_filters.twit_list); >>> CID 631130: Null pointer dereferences (FORWARD_NULL) >>> Passing "&user_list" to "listFree", which dereferences null "user_list.sem". 538 listFree(&user_list); 539 540 if (lastsub != INVALID_SUB) 541 smb_close(&smb); 542 fclose(rep); 543 ** CID 631129: Memory - corruptions (OVERRUN) /tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695 in iniReadEncryptedFile() _____________________________________________________________________________________________ *** CID 631129: Memory - corruptions (OVERRUN) /tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695 in iniReadEncryptedFile() 3689 *ks = keySize; 3690 if (saltBuf && saltsz && *saltsz) { 3691 size_t cp = *saltsz; 3692 if (cp < saltLength) 3693 cp = saltLength; 3694 if (cp) >>> CID 631129: Memory - corruptions (OVERRUN) >>> Overrunning array "salt" of 64 bytes by passing it to a function which accesses it at byte offset 64 using argument "cp" (which evaluates to 65). [Note: The source code implementation of the function has been overridden by a builtin model.] 3695 memcpy(saltBuf, salt, cp); 3696 if (cp < *saltsz) 3697 saltBuf[cp] = 0; 3698 } 3699 if (saltsz) 3700 *saltsz = saltLength; ________________________________________________________________________________________________________ To view the defects in Coverity Scan visit, https://scan.coverity.com/projects/synchronet?tab=overview ----==_mimepart_68e2993ee711b_9d27f2d5dd76db9a859454 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit New Defects Reported - Synchronet

Hi,

Please find the latest report on new defect(s) introduced to Synchronet found with Coverity Scan.

Defect Details

** CID 631146:       Program hangs  (LOCK)


_____________________________________________________________________________________________
*** CID 631146:         Program hangs  (LOCK)
/userdat.c: 4189             in loginAttemptListCount()
4183     long loginAttemptListCount(link_list_t* list)
4184     {
4185     	long count;
4186
4187     	if (!listLock(list))
4188     		return -1;
>>>     CID 631146:         Program hangs  (LOCK)
>>>     "listCountNodes" locks "list->mutex" while it is locked.
4189     	count = listCountNodes(list);
4190     	listUnlock(list);
4191     	return count;
4192     }
4193
4194     /****************************************************************************/

** CID 631145:       Program hangs  (SLEEP)


_____________________________________________________________________________________________
*** CID 631145:         Program hangs  (SLEEP)
/userdat.c: 4358             in loginBanned()
4352     	listUnlock(list);
4353     	if (node == NULL)
4354     		return 0;
4355     	attempt = node->data;
4356     	SAFECOPY(name, attempt->user);
4357     	truncstr(name, "@");
>>>     CID 631145:         Program hangs  (SLEEP)
>>>     Call to "trashcan" might sleep while holding lock "list->mutex".
4358     	if (((settings.tempban_threshold && (attempt->count - attempt->dupes) >= settings.tempban_threshold)
4359     	     || trashcan(cfg, name, "name")) && now < (time32_t)(attempt->time + settings.tempban_duration)) {
4360     		if (details != NULL)
4361     			*details = *attempt;
4362     		return settings.tempban_duration - (now - attempt->time);
4363     	}

** CID 631144:       Program hangs  (LOCK)


_____________________________________________________________________________________________
*** CID 631144:         Program hangs  (LOCK)
/sbbscon.c: 654             in client_on()
648     {
649     	if (on) {
650     		if (update) {
651     			list_node_t* node;
652
653     			listLock(&client_list);
>>>     CID 631144:         Program hangs  (LOCK)
>>>     "listFindNode" locks "client_list.mutex" while it is locked.
654     			if ((node = listFindTaggedNode(&client_list, sock)) != NULL)
655     				memcpy(node->data, client, sizeof(client_t));
656     			listUnlock(&client_list);
657     		} else {
658     			served++;
659     			listAddNodeData(&client_list, client, sizeof(client_t), sock, LAST_NODE);

** CID 631143:         (SLEEP)
/mailsrvr.c: 1225           in pop3_client_thread()


_____________________________________________________________________________________________
*** CID 631143:           (SLEEP)
/mailsrvr.c: 1241             in pop3_client_thread()
1235
1236     		srand((unsigned int)(time(NULL) ^ (time_t)GetCurrentThreadId()));   /* seed random number generator */
1237     		(void)rand(); /* throw-away first result */
1238     		safe_snprintf(challenge, sizeof(challenge), "<%x%x%lx%lx@%.128s>"
1239     		              , rand(), socket, (ulong)time(NULL), (ulong)clock(), server_host_name());
1240
>>>     CID 631143:           (SLEEP)
>>>     Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex".
1241     		sockprintf(socket, client.protocol, session, "+OK Synchronet %s Server %s%c-%s Ready %s"
1242     		           , client.protocol, VERSION, REVISION, PLATFORM_DESC, challenge);
1243
1244     		/* Requires USER or APOP command first */
1245     		for (i = 5; i; i--) {
1246     			if (!sockgetrsp(socket, client.protocol, session, NULL, buf, sizeof(buf)))
/mailsrvr.c: 1225             in pop3_client_thread()
1219     	client_on(socket, &client, FALSE /* update */);
1220
1221     	if (startup->login_attempt.throttle
1222     	    && (login_attempts = loginAttempts(startup->login_attempt_list, &pop3->client_addr)) > 1) {
1223     		lprintf(LOG_DEBUG, "%04d %-5s [%s] Throttling suspicious connection (%lu login attempts)"
1224     		        , socket, client.protocol, host_ip, login_attempts);
>>>     CID 631143:           (SLEEP)
>>>     Call to "nanosleep" might sleep while holding lock "startup->login_attempt_list->mutex".
1225     		mswait(login_attempts * startup->login_attempt.throttle);
1226     	}
1227
1228     	mail = NULL;
1229
1230     	do {
/mailsrvr.c: 1189             in pop3_client_thread()
1183     	ulong banned = loginBanned(&scfg, startup->login_attempt_list, socket, host_name, startup->login_attempt, &attempted);
1184     	if (banned) {
1185     		char ban_duration[128];
1186     		lprintf(LOG_NOTICE, "%04d %-5s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s"
1187     		        , socket, client.protocol, host_ip, attempted.count - attempted.dupes, attempted.user
1188     		        , duration_estimate_to_vstr(banned, ban_duration, sizeof ban_duration, 1, 1));
>>>     CID 631143:           (SLEEP)
>>>     Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex".
1189     		sockprintf(socket, client.protocol, session, "-ERR Access denied.");
1190     		return false;
1191     	}
1192     	struct trash trash;
1193     	if (trashcan2(&scfg, host_ip, NULL, "ip", &trash)) {
1194     		if (!trash.quiet) {
/mailsrvr.c: 1323             in pop3_client_thread()
1317     		if ((p = strstr(username, NO_SPAM)) != NULL) {
1318     			*p = 0;
1319     			lm_mode = LM_NOSPAM;
1320     		} else
1321     			lm_mode = 0;
1322     		if (!apop) {
>>>     CID 631143:           (SLEEP)
>>>     Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex".
1323     			sockprintf(socket, client.protocol, session, "+OK");
1324     			if (!sockgetrsp(socket, client.protocol, session, "PASS ", buf, sizeof(buf))) {
1325     				sockprintf(socket, client.protocol, session, "-ERR PASS command expected");
1326     				break;
1327     			}
1328     			p = buf + 5;
/mailsrvr.c: 1325             in pop3_client_thread()
1319     			lm_mode = LM_NOSPAM;
1320     		} else
1321     			lm_mode = 0;
1322     		if (!apop) {
1323     			sockprintf(socket, client.protocol, session, "+OK");
1324     			if (!sockgetrsp(socket, client.protocol, session, "PASS ", buf, sizeof(buf))) {
>>>     CID 631143:           (SLEEP)
>>>     Call to "sockprintf" might sleep while holding lock "startup->login_attempt_list->mutex".
1325     				sockprintf(socket, client.protocol, session, "-ERR PASS command expected");
1326     				break;
1327     			}
1328     			p = buf + 5;
1329     			SKIP_WHITESPACE(p);
1330     			SAFECOPY(password, p);
/mailsrvr.c: 1193             in pop3_client_thread()
1187     		        , socket, client.protocol, host_ip, attempted.count - attempted.dupes, attempted.user
1188     		        , duration_estimate_to_vstr(banned, ban_duration, sizeof ban_duration, 1, 1));
1189     		sockprintf(socket, client.protocol, session, "-ERR Access denied.");
1190     		return false;
1191     	}
1192     	struct trash trash;
>>>     CID 631143:           (SLEEP)
>>>     Call to "trashcan2" might sleep while holding lock "startup->login_attempt_list->mutex".
1193     	if (trashcan2(&scfg, host_ip, NULL, "ip", &trash)) {
1194     		if (!trash.quiet) {
1195     			char details[128];
1196     			lprintf(LOG_NOTICE, "%04d %-5s [%s] !CLIENT BLOCKED in ip.can %s", socket, client.protocol, host_ip, trash_details(&trash, details, sizeof details));
1197     		}
1198     		sockprintf(socket, client.protocol, session, "-ERR Access denied.");
/mailsrvr.c: 1201             in pop3_client_thread()
1195     			char details[128];
1196     			lprintf(LOG_NOTICE, "%04d %-5s [%s] !CLIENT BLOCKED in ip.can %s", socket, client.protocol, host_ip, trash_details(&trash, details, sizeof details));
1197     		}
1198     		sockprintf(socket, client.protocol, session, "-ERR Access denied.");
1199     		return false;
1200     	}
>>>     CID 631143:           (SLEEP)
>>>     Call to "trashcan2" might sleep while holding lock "startup->login_attempt_list->mutex".
1201     	if (trashcan2(&scfg, host_name, NULL, "host", &trash)) {
1202     		if (!trash.quiet) {
1203     			char details[128];
1204     			lprintf(LOG_NOTICE, "%04d %-5s [%s] !CLIENT BLOCKED in host.can: %s %s"
1205     					, socket, client.protocol, host_ip, host_name, trash_details(&trash, details, sizeof details));
1206     		}

** CID 631142:       Null pointer dereferences  (FORWARD_NULL)


_____________________________________________________________________________________________
*** CID 631142:         Null pointer dereferences  (FORWARD_NULL)
/un_qwk.cpp: 380             in sbbs_t::unpack_qwk(char *, unsigned int)()
374     	iniFreeStringList(voting);
375
376     	strListFree(&msg_filters.ip_can);
377     	strListFree(&msg_filters.host_can);
378     	strListFree(&msg_filters.subject_can);
379     	strListFree(&msg_filters.twit_list);
>>>     CID 631142:         Null pointer dereferences  (FORWARD_NULL)
>>>     Passing "&user_list" to "listFree", which dereferences null "user_list.sem".
380     	listFree(&user_list);
381
382     	delfiles(cfg.temp_dir, "*.NDX");
383     	SAFEPRINTF(str, "%sMESSAGES.DAT", cfg.temp_dir);
384     	removecase(str);
385     	SAFEPRINTF(str, "%sDOOR.ID", cfg.temp_dir);

** CID 631141:       Program hangs  (LOCK)


_____________________________________________________________________________________________
*** CID 631141:         Program hangs  (LOCK)
/userdat.c: 4264             in loginSuccess()
4258     	list_node_t* node;
4259
4260     	if (addr->addr.sa_family != AF_INET && addr->addr.sa_family != AF_INET6)
4261     		return;
4262     	listLock(list);
4263     	if ((node = login_attempted(list, addr)) != NULL)
>>>     CID 631141:         Program hangs  (LOCK)
>>>     "listRemoveNode" locks "list->mutex" while it is locked.
4264     		listRemoveNode(list, node, /* freeData: */ true);
4265     	listUnlock(list);
4266     }
4267
4268     /****************************************************************************/
4269     /* Returns number of *unique* login attempts (excludes consecutive dupes)	*/

** CID 631140:         (LOCK)
/userdat.c: 4206           in loginAttemptListClear()


_____________________________________________________________________________________________
*** CID 631140:           (LOCK)
/userdat.c: 4204             in loginAttemptListClear()
4198     long loginAttemptListClear(link_list_t* list)
4199     {
4200     	long count;
4201
4202     	if (!listLock(list))
4203     		return -1;
>>>     CID 631140:           (LOCK)
>>>     "listCountNodes" locks "list->mutex" while it is locked.
4204     	count = listCountNodes(list);
4205     	count -= listFreeNodes(list);
4206     	listUnlock(list);
4207     	return count;
4208     }
4209
/userdat.c: 4206             in loginAttemptListClear()
4200     	long count;
4201
4202     	if (!listLock(list))
4203     		return -1;
4204     	count = listCountNodes(list);
4205     	count -= listFreeNodes(list);
>>>     CID 631140:           (LOCK)
>>>     "listUnlock" unlocks "list->mutex" while it is unlocked.
4206     	listUnlock(list);
4207     	return count;
4208     }
4209
4210     /****************************************************************************/
4211     static list_node_t* login_attempted(link_list_t* list, const union xp_sockaddr* addr)

** CID 631139:       Program hangs  (SLEEP)
/services.c: 1619           in native_service_thread()


_____________________________________________________________________________________________
*** CID 631139:         Program hangs  (SLEEP)
/services.c: 1619             in native_service_thread()
1613     	client_on(socket, &client, false /* update */);
1614
1615     	if (startup->login_attempt.throttle
1616     	    && (login_attempts = loginAttempts(startup->login_attempt_list, &service_client.addr)) > 1) {
1617     		lprintf(LOG_DEBUG, "%04d %s Throttling suspicious connection from: %s (%lu login attempts)"
1618     		        , socket, service->protocol, client.addr, login_attempts);
>>>     CID 631139:         Program hangs  (SLEEP)
>>>     Call to "nanosleep" might sleep while holding lock "startup->login_attempt_list->mutex".
1619     		mswait(login_attempts * startup->login_attempt.throttle);
1620     	}
1621
1622     	/* RUN SCRIPT */
1623     	if (strpbrk(service->cmd, "/\\") == NULL)
1624     		SAFEPRINTF2(cmd, "%s%s", scfg.exec_dir, service->cmd);

** CID 631138:       Program hangs  (LOCK)
/services.c: 1651           in native_service_thread()


_____________________________________________________________________________________________
*** CID 631138:         Program hangs  (LOCK)
/services.c: 1651             in native_service_thread()
1645     		lprintf(LOG_INFO, "%04d %s service thread terminated (%lu clients remain, %lu total, %lu served)"
1646     		        , socket, service->protocol, remain, active_clients(), service->served);
1647
1648     	client_off(socket);
1649     	close_socket(socket);
1650     	closesocket(socket_dup);    /* close duplicate handle */
>>>     CID 631138:         Program hangs  (LOCK)
>>>     Returning without unlocking "startup->login_attempt_list->mutex".
1651     }
1652
1653
1654     void services_terminate(void)
1655     {
1656     	uint32_t i;

** CID 631137:       Program hangs  (ORDER_REVERSAL)


_____________________________________________________________________________________________
*** CID 631137:         Program hangs  (ORDER_REVERSAL)
/websrvr.c: 6965             in http_session_thread()
6959     	 */
6960     	session.req.method = HTTP_GET;
6961     	session.http_ver = HTTP_1_0;
6962     	if (startup->max_clients && client_count > startup->max_clients) {
6963     		lprintf(LOG_WARNING, "%04d %-5s [%s] !MAXIMUM CLIENTS (%u) exceeded by %u, access denied"
6964     		        , socket, session.client.protocol, session.host_ip, startup->max_clients, client_count - startup->max_clients);
>>>     CID 631137:         Program hangs  (ORDER_REVERSAL)
>>>     Calling "send_error" acquires lock "jsrt_mutex" while holding lock "link_list.mutex" (count: 1 / 5).
6965     		send_error(&session, __LINE__, error_503);
6966     		session.finished = true;
6967     	} else {
6968     		uint connections = listCountMatches(&current_connections, session.host_ip, strlen(session.host_ip) + 1);
6969     		if (startup->max_concurrent_connections > 0 && connections > startup->max_concurrent_connections
6970     		    && !is_host_exempt(&scfg, session.host_ip, /* host_name */ NULL)) {

** CID 631136:         (LOCK)
/mqtt.c: 842           in mqtt_client_on()


_____________________________________________________________________________________________
*** CID 631136:           (LOCK)
/mqtt.c: 842             in mqtt_client_on()
836     	for (list_node_t* node = mqtt->client_list.first; node != NULL; node = node->next) {
837     		client_t* client = node->data;
838     		format_client_info(str, sizeof(str), node->tag, client, client->time);
839     		strListPush(&list, str);
840     		client_count++;
841     	}
>>>     CID 631136:           (LOCK)
>>>     "listUnlock" unlocks "mqtt->client_list.mutex" while it is unlocked.
842     	listUnlock(&mqtt->client_list);
843     	char* buf = NULL;
844     	if (client_count > 0) {
845     		size_t buflen = client_count * MAX_CLIENT_STRLEN * 2;
846     		buf = malloc(buflen);
847     		strListJoin(list, buf, buflen, "\n");
/mqtt.c: 814             in mqtt_client_on()
808
809     	listLock(&mqtt->client_list);
810     	if (on) {
811     		if (update) {
812     			list_node_t* node;
813
>>>     CID 631136:           (LOCK)
>>>     "listFindNode" locks "mqtt->client_list.mutex" while it is locked.
814     			if ((node = listFindTaggedNode(&mqtt->client_list, sock)) != NULL) {
815     				memcpy(node->data, client, sizeof(client_t));
816     				format_client_info(str, sizeof(str), sock, client, time(NULL));
817     				mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/update", str);
818     			}
819     		} else {
/mqtt.c: 825             in mqtt_client_on()
819     		} else {
820     			listAddNodeData(&mqtt->client_list, client, sizeof(client_t), sock, LAST_NODE);
821     			format_client_info(str, sizeof(str), sock, client, client->time);
822     			mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/connect", str);
823     		}
824     	} else {
>>>     CID 631136:           (LOCK)
>>>     "listRemoveTaggedNode" locks "mqtt->client_list.mutex" while it is locked.
825     		client = listRemoveTaggedNode(&mqtt->client_list, sock, /* free_data: */ false);
826     		if (client != NULL) {
827     			format_client_info(str, sizeof(str), sock, client, time(NULL));
828     			mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/disconnect", str);
829     			FREE_AND_NULL(client);
830     		}
/mqtt.c: 820             in mqtt_client_on()
814     			if ((node = listFindTaggedNode(&mqtt->client_list, sock)) != NULL) {
815     				memcpy(node->data, client, sizeof(client_t));
816     				format_client_info(str, sizeof(str), sock, client, time(NULL));
817     				mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/update", str);
818     			}
819     		} else {
>>>     CID 631136:           (LOCK)
>>>     "listAddNodeData" locks "mqtt->client_list.mutex" while it is locked.
820     			listAddNodeData(&mqtt->client_list, client, sizeof(client_t), sock, LAST_NODE);
821     			format_client_info(str, sizeof(str), sock, client, client->time);
822     			mqtt_pub_strval(mqtt, TOPIC_SERVER, "client/action/connect", str);
823     		}
824     	} else {
825     		client = listRemoveTaggedNode(&mqtt->client_list, sock, /* free_data: */ false);

** CID 631135:       Uninitialized variables  (UNINIT)
/tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695           in iniReadEncryptedFile()


_____________________________________________________________________________________________
*** CID 631135:         Uninitialized variables  (UNINIT)
/tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695             in iniReadEncryptedFile()
3689     		*ks = keySize;
3690     	if (saltBuf && saltsz && *saltsz) {
3691     		size_t cp = *saltsz;
3692     		if (cp < saltLength)
3693     			cp = saltLength;
3694     		if (cp)
>>>     CID 631135:         Uninitialized variables  (UNINIT)
>>>     Using uninitialized value "*salt" when calling "memcpy". [Note: The source code implementation of the function has been overridden by a builtin model.]
3695     			memcpy(saltBuf, salt, cp);
3696     		if (cp < *saltsz)
3697     			saltBuf[cp] = 0;
3698     	}
3699     	if (saltsz)
3700     		*saltsz = saltLength;

** CID 631134:       Program hangs  (LOCK)
/mailsrvr.c: 1190           in pop3_client_thread()


_____________________________________________________________________________________________
*** CID 631134:         Program hangs  (LOCK)
/mailsrvr.c: 1190             in pop3_client_thread()
1184     	if (banned) {
1185     		char ban_duration[128];
1186     		lprintf(LOG_NOTICE, "%04d %-5s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s"
1187     		        , socket, client.protocol, host_ip, attempted.count - attempted.dupes, attempted.user
1188     		        , duration_estimate_to_vstr(banned, ban_duration, sizeof ban_duration, 1, 1));
1189     		sockprintf(socket, client.protocol, session, "-ERR Access denied.");
>>>     CID 631134:         Program hangs  (LOCK)
>>>     Returning without unlocking "startup->login_attempt_list->mutex".
1190     		return false;
1191     	}
1192     	struct trash trash;
1193     	if (trashcan2(&scfg, host_ip, NULL, "ip", &trash)) {
1194     		if (!trash.quiet) {
1195     			char details[128];

** CID 631133:       Program hangs  (LOCK)


_____________________________________________________________________________________________
*** CID 631133:         Program hangs  (LOCK)
/userdat.c: 4303             in loginFailure()
4297     	if (pass != NULL)
4298     		SAFECOPY(attempt->pass, pass);
4299     	attempt->count++;
4300     	count = attempt->count - attempt->dupes;
4301     	if (node == NULL) {
4302     		attempt->first = attempt->time;
>>>     CID 631133:         Program hangs  (LOCK)
>>>     "listAddNodeData" locks "list->mutex" while it is locked.
4303     		listPushNodeData(list, attempt, sizeof(login_attempt_t));
4304     	}
4305     	listUnlock(list);
4306
4307     	if (details != NULL)
4308     		*details = *attempt;

** CID 631132:       Control flow issues  (NO_EFFECT)
/tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3630           in iniReadEncryptedFile()


_____________________________________________________________________________________________
*** CID 631132:         Control flow issues  (NO_EFFECT)
/tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3630             in iniReadEncryptedFile()
3624     	buffer = malloc(bufferSize);
3625     	if (buffer == NULL)
3626     		goto done;
3627     	size_t lines = 0;
3628     	while(!feof(fp)) {
3629     		size_t rret = fread(buffer, 1, bufferSize, fp);
>>>     CID 631132:         Control flow issues  (NO_EFFECT)
>>>     This less-than-zero comparison of an unsigned value is never true. "rret < 0UL".
3630     		if (rret < 0 || rret > INT_MAX)
3631     			goto done;
3632     		if ((streamCipher && rret > 0) || rret == bufferSize) {
3633     			size_t bufpos = 0;
3634     			status = cryptDecrypt(ctx, buffer, rret);
3635     			if (cryptStatusError(status))

** CID 631131:         (SLEEP)
/websrvr.c: 6948           in http_session_thread()


_____________________________________________________________________________________________
*** CID 631131:           (SLEEP)
/websrvr.c: 6911             in http_session_thread()
6905     	}
6906
6907     	login_attempt_t attempted;
6908     	ulong           banned = loginBanned(&scfg, startup->login_attempt_list, session.socket, host_name, startup->login_attempt, &attempted);
6909
6910     	/* host_ip wasn't defined in http_session_thread */
>>>     CID 631131:           (SLEEP)
>>>     Call to "trashcan2" might sleep while holding lock "startup->login_attempt_list->mutex".
6911     	if (banned || trashcan2(&scfg, session.host_ip, NULL, "ip", &trash)) {
6912     		if (banned) {
6913     			char ban_duration[128];
6914     			lprintf(LOG_NOTICE, "%04d %-5s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s"
6915     			        , session.socket, session.client.protocol
6916     			        , session.host_ip, attempted.count - attempted.dupes, attempted.user
/websrvr.c: 7055             in http_session_thread()
7049     				}
7050     				/* At this point, if redirp is non-NULL then the headers have already been parsed */
7051     				if ((session.http_ver < HTTP_1_0) || redirp != NULL || parse_headers(&session)) {
7052     					if (check_request(&session)) {
7053     						if (session.req.send_location < MOVED_TEMP || session.req.virtual_path[0] != '/' || loop_count++ >= MAX_REDIR_LOOPS) {
7054     							if (read_post_data(&session))
>>>     CID 631131:           (SLEEP)
>>>     Call to "respond" might sleep while holding lock "startup->login_attempt_list->mutex".
7055     								respond(&session);
7056     						}
7057     						else {
7058     							if (!session.redir_req[0]) {
7059     								safe_snprintf(session.redir_req, sizeof(session.redir_req), "%s %s%s%s", methods[session.req.method]
7060     								              , session.req.virtual_path, session.http_ver < HTTP_1_0?"":" ", http_vers[session.http_ver]);
/websrvr.c: 6948             in http_session_thread()
6942     	client_on(session.socket, &session.client, /* update existing client record? */ false);
6943
6944     	if (startup->login_attempt.throttle
6945     	    && (login_attempts = loginAttempts(startup->login_attempt_list, &session.addr)) > 1) {
6946     		lprintf(LOG_DEBUG, "%04d %-5s [%s] Throttling suspicious connection (%lu login attempts)"
6947     		        , socket, session.client.protocol, session.host_ip, login_attempts);
>>>     CID 631131:           (SLEEP)
>>>     Call to "nanosleep" might sleep while holding lock "startup->login_attempt_list->mutex".
6948     		mswait(login_attempts * startup->login_attempt.throttle);
6949     	}
6950
6951     	session.last_user_num = -1;
6952     	session.last_js_user_num = -1;
6953     	session.logon_time = 0;

** CID 631130:       Null pointer dereferences  (FORWARD_NULL)


_____________________________________________________________________________________________
*** CID 631130:         Null pointer dereferences  (FORWARD_NULL)
/un_rep.cpp: 538             in sbbs_t::unpack_rep(char *)()
532     	iniFreeStringList(voting);
533
534     	strListFree(&msg_filters.ip_can);
535     	strListFree(&msg_filters.host_can);
536     	strListFree(&msg_filters.subject_can);
537     	strListFree(&msg_filters.twit_list);
>>>     CID 631130:         Null pointer dereferences  (FORWARD_NULL)
>>>     Passing "&user_list" to "listFree", which dereferences null "user_list.sem".
538     	listFree(&user_list);
539
540     	if (lastsub != INVALID_SUB)
541     		smb_close(&smb);
542     	fclose(rep);
543

** CID 631129:       Memory - corruptions  (OVERRUN)
/tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695           in iniReadEncryptedFile()


_____________________________________________________________________________________________
*** CID 631129:         Memory - corruptions  (OVERRUN)
/tmp/sbbs-Oct-05-2025/src/xpdev/ini_file.c: 3695             in iniReadEncryptedFile()
3689     		*ks = keySize;
3690     	if (saltBuf && saltsz && *saltsz) {
3691     		size_t cp = *saltsz;
3692     		if (cp < saltLength)
3693     			cp = saltLength;
3694     		if (cp)
>>>     CID 631129:         Memory - corruptions  (OVERRUN)
>>>     Overrunning array "salt" of 64 bytes by passing it to a function which accesses it at byte offset 64 using argument "cp" (which evaluates to 65). [Note: The source code implementation of the function has been overridden by a builtin model.]
3695     			memcpy(saltBuf, salt, cp);
3696     		if (cp < *saltsz)
3697     			saltBuf[cp] = 0;
3698     	}
3699     	if (saltsz)
3700     		*saltsz = saltLength;

  

View Defects in Coverity Scan

Best regards,

The Coverity Scan Admin Team

----==_mimepart_68e2993ee711b_9d27f2d5dd76db9a859454-- --- þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net .