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
Hi,
Please find the latest report on new defect(s) introduced to Synchronet found with Coverity Scan.
** 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;
Best regards,
The Coverity Scan Admin Team