Skip to content
Snippets Groups Projects
  1. Apr 05, 2023
  2. Apr 04, 2023
    • Rob Swindell's avatar
      Fix double-free race condition with SBBSCTRL upon global recycle · 28fa44ed
      Rob Swindell authored
      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.
      28fa44ed
    • Rob Swindell's avatar
  3. Apr 03, 2023
  4. Apr 02, 2023
  5. Apr 01, 2023
  6. Mar 31, 2023
  7. Mar 29, 2023
  8. Mar 28, 2023
  9. Mar 27, 2023
  10. Mar 26, 2023
  11. Mar 25, 2023
    • Rob Swindell's avatar
      Store the last read configuration filename in scfg_t.filename · 67a4da03
      Rob Swindell authored
      Allows SCFG to more easily display the most relevant .ini file using the
      UIFC timedisplay() callback.
      67a4da03
    • Rob Swindell's avatar
    • Rob Swindell's avatar
      Create the "Servers" configuration sub-menu, currently read-only · 00f971d7
      Rob Swindell authored
      I'm surprised more people haven't wondered aloud: why are all the Synchronet
      server settings in this huge sbbs.ini file? Well... this kind of answers that
      question: it's a hell of a lot of settings! And this isn't even everything
      (several advanced/rarely-used/borderline-deprecated settings aren't included)!
      
      As part of this change, I've replaced the old date/time display with the
      current config file path/name that's being edited (more or less). This will
      help when a sysop has multiple sbbs.*.ini files and makes it clear if you have
      multiple sbbs installs (like me), which one you're editing at any given time.
      
      I have not implemented any of the server setting edits (other than a couple
      simple toggles) or help text yet and this does not detect changes or save them
      to the sbbs.ini file, but I wanted to get this committed at this stage anyway.
      If you're running sbbsctrl.exe (or maybe even gtkmonitor), then maybe this is
      completely redundant and unnecessary, but I figured it was good to have these
      settings in one edit find/edit platform-agnostic location anyway. Hoepfully
      this will (when its done) make SBBS for *nix just that much easier for a newbie
      sysop/sysadmin.
      00f971d7
  12. Mar 24, 2023
    • Rob Swindell's avatar
      Set initial state of 'data_event' and 'highwater_event' to *not* signaled · 834d89ea
      Rob Swindell authored
      Since commit fd90eec6 (2 months ago), the Synchronet Web Server on
      my Windows systems has occasionally gone into a state where every HTTP session
      thread was causing 100% CPU utilization and each new HTTP session thread
      would just exacerbate the problem eventually leading to complete system
      instability/unresponsiveness until the sbbs instance was terminated. This was
      more readily reproducible on a Win7-32 VM, but would occasionally, though
      much less frequently, happen in a native instance on Win10-64 as well.
      
      Using the VisualStudio debugger, I was able to narrow it down to this:
      
      Each new HTTP thread (eventually, hundreds of such threads) would get stuck
      in this loop in http_output_thread():
      
          while(session->socket!=INVALID_SOCKET) {
      
      		/* Wait for something to output in the RingBuffer */
      		if((avail=RingBufFull(obuf))==0) {	/* empty */
      			if(WaitForEvent(obuf->data_event, 1000) != WAIT_OBJECT_0)
      				continue;
      			/* Check for spurious sem post... */
      			if((avail=RingBufFull(obuf))==0)
      				continue; // <--- data_event signaled, but never cleared
      		}
      
      There appears to be a race condition where this logic could be executed
      immediately after the output ringbuf was created, but before writebuf() was
      ever called (which would have actually placed data in the output buffer),
      causing a potential high-utilization infinite loop: the data_event is signaled
      but there is no data and the event is never reset and nothing can ever add
      data to the ringbuf due to starvation of CPU cycles.
      
      Uses of ringbuf's data_event elsewhere in Synchronet don't seem to be subject
      to this issue since they always call RingBufRead after, which will clear the
      data_event when the ringbuf is actually empty (no similar loops to this one).
      
      The root cause just appears to be a simple copy/paste issue in the code added
      to RingBufInit(): the preexisting 'empty_event' was initialized with a
      correct initiate state of 'signaled' (because by default a ringbuf is empty)
      but the newly added events (data_event and highwater_event) should *not* be
      initially-signaled because... the ringbuf is empty. So I added some parameter
      comments to these calls to CreateEvent() to hopefully make that more clear
      and prevent similar mistakes in the future.
      
      Relieved to have this one resolved finally.
      834d89ea
    • Rob Swindell's avatar
  13. Mar 21, 2023
Loading