DragonFlyBSD Kernel Audit
DF-0835 / fix_run.log
← back to finding ↓ download raw
=== FIX VALIDATION: before/after disassembly comparison ===

========================================================
BASELINE (unpatched #0 kernel smbfs.ko) — BUG PRESENT
========================================================
F_SETLK path, call to smbfs_smb_lock:
  0xce5e <+318>: xor    %esi,%esi          # op = 0 = SMB_LOCK_EXCL (ALWAYS)
  0xce60 <+320>: mov    %r15,%rdi           # np
  0xce63 <+323>: callq  smbfs_smb_lock

=> Inner switch (F_RDLCK/F_WRLCK/F_UNLCK) is DEAD-CODE-ELIMINATED.
=> F_RDLCK (shared) is sent as SMB_LOCK_EXCL (exclusive).
=> F_UNLCK (unlock within F_SETLK) acquires a new exclusive lock.

========================================================
PATCHED (fix.diff applied smbfs.ko) — BUG FIXED
========================================================
F_SETLK path, switch is now LIVE as a jump table:
  0xc5d0 <+256>: movzwl 0x14(%r14),%eax    # load fl->l_type
  0xc5d5 <+261>: sub    /bin/shx1,%eax           # index = l_type - 1
  0xc5ef <+287>: mov    0x0(,%rax,4),%eax   # lkop = switch_table[index]
  0xc5f9 <+297>: mov    %eax,-0x4c(%rbp)    # save lkop
  ... lf_advlock call ...
  0xc60c <+316>: mov    -0x4c(%rbp),%esi    # op = lkop (NOT hardcoded!)
  0xc621 <+337>: callq  smbfs_smb_lock

Jump table at .rodata+0x300 = [1, 2, 0]:
  F_RDLCK (l_type=1, idx=0): op = 1 = SMB_LOCK_SHARED  [CORRECT]
  F_UNLCK (l_type=2, idx=1): op = 2 = SMB_LOCK_RELEASE [CORRECT]
  F_WRLCK (l_type=3, idx=2): op = 0 = SMB_LOCK_EXCL    [CORRECT]

========================================================
MODULE LOAD TEST
========================================================
PATCHED smbfs.ko loaded successfully
10    1 0xffffffff82600000    16000 smbfs.ko

VERDICT: Fix closes the bug. The unconditional lkop=SMB_LOCK_EXCL
overwrite is removed; the switch result now flows through to
smbfs_smb_lock, correctly mapping POSIX lock types to SMB operations.