Rocksolid Light

Welcome to RetroBBS

mail  files  register  newsreader  groups  login

Message-ID:  

Life is knowing how far to go without crossing the line.


dovenet / Synchronet Programming / src/sbbs3/sbbs_ini.c

SubjectAuthor
o src/sbbs3/sbbs_ini.cRob Swindell (on Windows)

1
src/sbbs3/sbbs_ini.c

<642BC0AA.46871.syncprog@vert.synchro.net>

  copy mid

https://www.rocksolidbbs.com/dovenet/article-flat.php?id=872&group=DOVE-Net.Synchronet_Programming#872

  copy link   Newsgroups: DOVE-Net.Synchronet_Programming
From: rob.swindell.(on.windows)@VERT (Rob Swindell (on Windows))
To: Git commit to main/sbbs/master
Subject: src/sbbs3/sbbs_ini.c
Message-ID: <642BC0AA.46871.syncprog@vert.synchro.net>
Date: Mon, 3 Apr 2023 23:16:10 -0700
X-Comment-To: Git commit to main/sbbs/master
Path: rocksolidbbs.com!not-for-mail
Organization: Vertrauen
Newsgroups: DOVE-Net.Synchronet_Programming
X-FTN-PID: Synchronet 3.20a-Linux master/0f4325eec Apr 3 2023 GCC 12.2.0
X-FTN-MSGID: 46871.syncprog@1:103/705 2891adc1
X-FTN-CHRS: CP437 2
WhenImported: 20230403231610-0700 c1e0
WhenExported: 20230404103836-0700 c1e0
ExportedFrom: VERT syncprog 46871
Content-Type: text/plain; charset=IBM437
Content-Transfer-Encoding: 8bit
 by: Rob Swindell (on Win - Tue, 4 Apr 2023 06:16 UTC

https://gitlab.synchro.net/main/sbbs/-/commit/f95f67ac43c455993a84f03d
Modified Files:
src/sbbs3/sbbs_ini.c
Log Message:
Fix double-free race condition with SBBSCTRL upon global recycle

When multiple servers are recycling at the same time, (e.g. due to saved
change in SCFG) they'd each call sbbs_read_ini() with a shared global_startup
struct, which in turn calls sbbs_free_ini(), which would free all the
allocated network interface lists (including the global_startup one) using
iniFreeStringList (just a wrapper for strListFree), but iniFreeStringList()
does NOT modify (NULLify) the freed-pointer, so your second or third server
that called sbbs_read_ini(), with the shared MainForm->global structure, would
*again* free the same global interface list. This bug actually has always
existed because get_ini_globals() freed the global interface list in the same
way, except it *immediately* re-allocated a new one by calling
iniGetStringList(), so the time window (opportunity) for this race condition
to occur was much smaller. Truly, SBBSCTRL should use a mutex or other
mechanism to protect the shared global_startup struct, but this is a first
step to a full fix: sbbs_free_ini() should (and now does) nullify the freed
network interface pointers by using strListFree() directly. I haven't been
able to reproduce the crash upon recycle in SBBSCTRL after making this change.

---
■ Synchronet ■ Vertrauen ■ Home of Synchronet ■ [vert/cvs/bbs].synchro.net


dovenet / Synchronet Programming / src/sbbs3/sbbs_ini.c

1
server_pubkey.txt

rocksolid light 0.9.81
clearnet tor