https://gitlab.synchro.net/main/sbbs/-/commit/3f0508da6bce06fb59f76358
Modified Files:
src/sbbs3/ftpsrvr.cpp
Log Message:
ftpsrvr: fix file-descriptor leaks in directory/index handlers
Two distinct leaks of per-command temp-file descriptors, both surfacing
as "ERROR 24 (Too many open files)" once the process exhausts its
descriptor table -- after which every temp-file open (LIST/MLSD .lst,
index .ndx, QWK packets, and even unrelated subsystems sharing the
process) fails in a storm.
1) MDTM <index-file> (getdate) opened a temp .ndx file via ftp_tmpfname()
but never closed it: the lone fclose(fp) lives only in the !getdate
(download) branch. Every MDTM on the dynamically-generated index file
(startup->index_file_name, e.g. 00index) leaked one descriptor and
orphaned an sbbstemp/SBBS_FTP.*.ndx file. FTP clients and crawlers
MDTM each listed entry, so these accumulated steadily.
Fix: don't open the temp file for a getdate/MDTM request at all (it is
only needed to generate listing content); move the fopen into the
!getdate branch.
Introduced in 63e5e08f1c (2007-02-11), which made the index fopen
unconditional and added early-outs for SIZE (continue) and MDTM
(fall-through) that both bypassed the fclose. ff9ae78f44 (2007-11-28)
fixed the SIZE half by moving its check above the fopen, but left the
MDTM path leaking -- for ~18 years.
2) The MLSD, LIST and index-generation handlers "continue" out of the
command loop on smb_open_dir() failure without closing the already-
opened temp fp (and, for LIST/MLSD, without servicing the already-
announced data connection). Triggers whenever a directory's .shd is
locked or contended.
Fix: close fp on the failure path; for LIST/MLSD also run the normal
filexfer() cleanup so the data connection is serviced and the temp
file removed.
Introduced in 925e3b0a2 (2021-04-04), which migrated FTP directory
listings to smb_open_dir()/loadfiles().
Co-Authored-By: Claude Opus 4.7 (1M context) <
noreply@anthropic.com>
--- SBBSecho 3.37-Linux
* Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)