github BlitterStudio/dopus5 5.93

latest releases: v5.102, v5.93.0, 5.101...
4 months ago

First numbered release of this fork, based on upstream mheyer32/dopus5allamigas v5.93.0. Adds a round of bug fixes (memory leaks, enforcer hits, disk-reporting), fixes a GCC 6.5.0b miscompile that crashed clock_proc, and replaces the build/release pipeline with one that attaches artifacts to tagged releases.

Only an OS3 build is attached to this release — OS4 and MorphOS builds are fixed in 5.94.

Bug fixes

  • Enforcer hits on stale lister pointersfunction_lock_paths and function_unlock_paths dereferenced node->lister after the lister window had been closed, triggering reads of freed memory at lister+0x1503 and lister+0x5E2. Both paths now validate against GUI->lister_list under the shared lock before touching the lister.
  • Disk percentage > 100% on floppies and misbehaving drives — used wrong intermediate divisions; rewritten as (used * 100) / total with a defensive 100% cap. Fixes upstream issue #7.
  • Title-bar and device-list hardening for large/bogus drives — cap Full% at 100% when id_NumBlocksUsed > id_NumBlocks, show "?" for Free/In Use in that case instead of tens-of-terabytes wrap-around, add a TB tier to BytesToString64 (legitimate multi-TB volumes show "23.5T" instead of "HUGE"), widen block counts through ULONG before promoting to UQUAD to avoid sign-extension on drives with more than 2³¹ blocks.
  • xadopus hangs on archive drag/copy — added a 30 s LaunchCommand timeout and fixed NULL-pointer bugs in _doubleclick, _viewcommand, _copy. Module bumped to 93.
  • GCC 6.5.0b miscompile of inline library headersSysInfo.h, newicon.h, multiuser.h used the ((fn*)(base - LVO))(base) idiom with register __asm("a6"); GCC 6.5.0b (amigadev/crosstools) emitted jsr +LVO(a6) instead of jsr -LVO(a6), jumping into garbage and crashing with 80000004 on the first SysInfo.library call from clock_proc. Rewritten with LP0/LP1/… macros from <inline/macros.h>, whose inline asm hardcodes the minus sign and is immune to the miscompile. NO_INLINE_STDARG varargs helpers preserved.

Memory / resource leaks

Leaks ported from Hagbard-Celin/galileo:

  • launcher.cDeleteMsgPort(reply_port) on launcher_proc exit
  • rexx_handler.cClearRexxMsg before DeleteRexxMsg; reply port leak on sync path
  • callback_main.c — free rm_Result2 argstring in HookRexxCommand
  • fileclass_editor.c — free result argstring + ClearRexxMsg in classed_send_rexx
  • desktop_drop.cUnLock(CurrentDir(old)) in desktop_drop_on_object
  • event_loop.c — remove stray break that skipped ReplyAppMessage
  • function_launch.c — free partial allocations on failure in function_new_handle
  • themes.c — unified cleanup path in save_theme, handles CreateMsgPort failure

Additional leaks found by audit:

  • config_open.cL_OpenButtonBank bailed via return NULL on convert_button_window failure, leaking the IFF handle and buttons-drawer Lock and leaving CurrentDir pointing at a freed lock. Now uses a unified cleanup path.
  • filetype.ccreator_gui created data->app_port but never called DeleteMsgPort before FreeVec(data); leaked one port per invocation.
  • ftp_main.c — if rexport CreateMsgPort succeeded but nfyport failed, AddPort(rexport) was skipped yet cleanup unconditionally called RemPort(rexport) on the un-Added port (undefined behaviour). Split so AddPort pairs with the always-run cleanup.
  • function_filechange.calloc_filechange leaked the AllocMemH'd FileChange block if AllocDosObject(DOS_FIB) failed.

Other fixes ported from Hagbard-Celin/galileo:

  • launcher.cDupLock/UnLock around CurrentDir swap so a Project-icon launch does not clobber the WBArg lock when the default tool has no path.
  • backdrop.c — replace BOOL only_icon with ULONG mode (BTRM_WINDOW|BTRM_NOBORDER|BTRM_ICON) in backdrop_test_rmb so the group-window popup uses the WhichLayer result instead of a naive bounds check, preventing popups firing through overlapping windows.
  • filetypes_proc.c — skip GetFileVersion for directories.

Build / CI

  • OS3 build switched to sacredbanana/amiga-compiler (NDK 3.2 headers; still GCC 6.5.0b). Matrix-builds debug and release from one job, concurrency group cancels superseded runs, workflow_dispatch trigger added, upload step now fails if no archive is produced instead of silently succeeding.
  • Automated tagged releases via ncipollo/release-action. Release job accepts numeric tags like 5.93 in addition to v*, and matches the version-suffixed archive produced by the makefile (the hardcoded Dopus5_os3.zip never existed, so earlier tags attached no artifact).
  • Pack releases with lha instead of zip — AmigaOS unzip does not restore the e protection flag, so binaries extracted from the CI zip were not executable. lha is already in the compiler image; executables are chmod +x'd before packing so Amiga LHA maps the permission back to e on extract.
  • Stub creal/cimag in math_replace.h — release build (-Os -flto) pulled libm020/libm.a(cexp.o) via LTO during the diskinfo.module link; sacredbanana's libm is missing these symbols. Diskinfo never calls cexp; minimal implementations via GCC __real__/__imag__ satisfy the linker without affecting behaviour.
  • Bump CI actions off Node 20: checkout v4 → v6, upload-artifact v4 → v7.

Other

  • Copyright year updated to 2026.
  • Non-ASCII character fix.
  • Internal docs mapping module discovery/identification, module entry points and execution protocol, and the EXTCMD_* callback system (not user-visible; for future maintainers).

PROG_REVISION bumped to 93. LIB/CMD ABI versions unchanged.

Full Changelog: https://github.com/midwan/dopus5allamigas/commits/5.93

Don't miss a new dopus5 release

NewReleases is sending notifications on new releases.