• src/sbbs3/userdat.c

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Wednesday, January 15, 2025 20:09:08
    https://gitlab.synchro.net/main/sbbs/-/commit/46cd7bbc3caea731da4075b9
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Fix parsing of field-separated birthdate strings with 4-digit year

    ... which is the format expected/required when entering or editing birthdates in the terminal server. So this is a pretty embarassingly bad bug introduced just before the v3.20b release to fix a less-severe bug with ecWeb new user registration (still) writing 2-digit years to the user.birthdate field. :-(

    Fix for issue #863

    I considerd making these get_birthdate field functions more tolerant of less strictly formatted strings (e.g. single-digit month or day), but decided to keep this change to just a fix for the issue at hand. These functions could be more robust to handle more variance in user/script input.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Deuc¿@VERT to Git commit to main/sbbs/master on Sunday, January 19, 2025 22:45:36
    https://gitlab.synchro.net/main/sbbs/-/commit/046a7e535d163bfc99deb4c8
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Zero-length string is not a valid real name.

    ---
    þ 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 Monday, February 03, 2025 11:25:22
    https://gitlab.synchro.net/main/sbbs/-/commit/1677e74966d6449e108ec464
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Fix ERROR 2 (...) in putnode.cpp ... opening "node.exb"

    Need the O_CREAT mode flag.

    Broken with commit d116f3622: I started using opennodeext() (created 5 years ago with commit 710bb23c1bd) rather than nopen(), and I didn't realize that opennodeext() was not including O_CREAT.

    Once the ctrl/node.exb was created (by anything), this error wouldn't happen. And it'd only be an issues for systems with text.dat's that included custom node status (NodeAction*) strings. Good catch Nelgin!

    ---
    þ 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 Friday, April 11, 2025 18:13:56
    https://gitlab.synchro.net/main/sbbs/-/commit/02021bb18021c5d9d3da6e65
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Move check_pass() nearer the other check_* functions

    ---
    þ 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 Thursday, August 07, 2025 22:32:51
    https://gitlab.synchro.net/main/sbbs/-/commit/8e4a5c7fbabc68de3094c18f
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Add some comments to clarify difference between getbirthdstr and format_birth

    ---
    þ 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 Saturday, August 09, 2025 19:12:38
    https://gitlab.synchro.net/main/sbbs/-/commit/c2805c6babbed02117e84852
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    User the laston date (rather than the last logon date/time) to reset stats

    (daily stat fields, logons/posts/emails/etc per day)

    This behavior was changed (broken) in commit ed00ed77

    ---
    þ 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 Saturday, August 09, 2025 22:27:00
    https://gitlab.synchro.net/main/sbbs/-/commit/5e4076dbf2c128c98fa31f47
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Eliminate the (now) unnecessary ushort range checking

    ---
    þ 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 Sunday, August 10, 2025 15:16:51
    https://gitlab.synchro.net/main/sbbs/-/commit/7a66d7f639788ba50797f943
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Resolve CID 583942 with a typecast

    Will need to switch to 64-bit time_t everywhere by 2038. We only maintain 32-bit time_t support (via time32_t) for Borland C++ compatibility.

    ---
    þ 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 Sunday, August 10, 2025 21:40:43
    https://gitlab.synchro.net/main/sbbs/-/commit/27cbebcb9ac75ff1f51a5ef2
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    There are actually 8 user fields that reset/zeroed daily, so check them all

    This is really just an optimization (I think), so we don't call time() for every parse/getuserdat() call, but only when the user has a non-zero daily reset field.

    ---
    þ 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 Monday, August 11, 2025 15:51:59
    https://gitlab.synchro.net/main/sbbs/-/commit/bd9719d8df4a918ee1667d5a
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Add a user.level valid value range check to resetdailyuserdat()

    ... just in case we're called with an uninitialized user struct.

    Related to CID 583999

    ---
    þ 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 Sunday, September 14, 2025 19:48:26
    https://gitlab.synchro.net/main/sbbs/-/commit/869dac47e01978f4e7f20fb5
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Fix inverted "GUEST" ARS keyword logic bug

    introduced in commit 661f5084fca81a01

    Fixes issue #975

    ---
    þ 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 Tuesday, January 13, 2026 22:16:37
    https://gitlab.synchro.net/main/sbbs/-/commit/fe0ef584fb420831e37e4174
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Address new Coverity issue

    CID 640988: Null pointer dereferences (FORWARD_NULL)

    ---
    þ 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 Thursday, January 15, 2026 16:38:13
    https://gitlab.synchro.net/main/sbbs/-/commit/abf06be881e9b986937c72de
    Modified Files:
    src/sbbs3/userdat.c
    Log Message:
    Fix "executing xtrn" node_activity() for multiple-concurrent logons (Guests)

    The name of the external program was pulled from the user record which in this case would always be the last program executed by (any) Guest. Instead, use
    the (slightly more ambiguous) node.aux field for external program being executed by Guest users or upon any failure to read the user record.

    ---
    þ 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 Wednesday, March 11, 2026 00:14:47
    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 Wednesday, March 11, 2026 02:35:19
    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 Sunday, March 29, 2026 19:04:53
    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 Friday, April 03, 2026 09:32:34
    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 Wednesday, May 06, 2026 19:41:53
    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 Debian Linux)@VERT to Git commit to main/sbbs/master on Monday, August 17, 2026 02:07:18
    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