• src/sbbs3/userdat.c

    From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Wed Mar 11 00:14:47 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/d86d4d47d1ffc150ff9a95e6
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    A small optimization of user_can_access_grp/lib functions

    No need to check every sub/dir

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Wed Mar 11 02:35:19 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/a1b1612f3b68c1ecd5001bbf
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Remove unused variable

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Sun Mar 29 19:04:53 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/d8f673e82414c624b9d26d82
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    del_lastuser() truncates the user index (name.dat) file as well as data file

    Fix issue #1100, reported in IRC by plt

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Fri Apr 3 09:32:34 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/d44ddf8700f9782b7efe7cc2
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Remove extraneous "external program" text from node status string

    When the xtrn prog code is valid, we include the program's full name in the status string and don't need the "external program" designation that was added in commit cc4fea1c6fd.

    Thanks to xbit for pointing out in IRC.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Wed May 6 19:41:53 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/6efdf3890e49237f9e099f01
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    userdat: suppress LOCK false-positives in login* family (CIDs 631133, 631140, 631141, 631146)

    The link_list_t mutex is explicitly documented as recursive
    (link_list.h:99) Ä internal listCountNodes/listFreeNodes/listRemoveNode/ listPushNodeData calls re-acquire it safely. Coverity doesn't trace the recursive flag, so it flags every "outer-locked listX call" as a
    potential deadlock. Annotate each call site with a SUPPRESS plus a
    pointer to the documented invariant.

    CID 631145 (SLEEP-while-locked in loginBanned) was already mitigated
    in current source: listUnlock is called before the trashcan() call.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Sun Aug 9 00:19:25 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/6651ed85c10b9dd3e7ad52c4
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Fix: check_realname() don't check for multiple names when real names not req'd

    Bug discovered by Cyan (one name) trying to register a new user at bbsdev.net which does not prompt for a real name for new users (copies the user's alias, but required as space in it and rejected the new user ungracefully).

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Mon Aug 17 02:07:18 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/247ed952d22d98605c63cd51
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Don't lock every user record just to count the users

    readuserdat() is built for reading a single record safely: per call it
    does a filelength(), a seek, a shared byte-range lock, the read, and an
    unlock. total_users() called it once per user slot, so counting the
    users cost five file operations and two byte-range locks per slot.

    Byte-range locks are the worst possible unit of work when the data
    directory is network-mounted. They are synchronous round-trips to the
    lock manager and, unlike reads, can be neither cached nor batched by the
    client whatever its caching settings. Locking never made the total
    atomic either - only each record read within it - so the count was
    already assembled from records read at different moments.

    Read the user file sequentially in bulk and split the records in memory instead. The result is unchanged: records flagged DELETED or INACTIVE
    are still excluded. A record rewritten mid-scan can now be misparsed and
    shift the total by one, where before it would merely have been counted
    as of a slightly different moment; for a displayed total, neither is
    more meaningful than the other.

    For 1,457 user slots this replaces 7,286 file operations - 2,914 of them
    locks - with about 25 reads and no locks, taking the scan from 85ms to
    5ms with the data directory on a loopback SMB mount.

    This is the same fix as 8561162afd (fighter-20-fears, 2026-07-29),
    applied to the user census rather than the node list.

    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

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