DF-0835 / fix_run.log
=== 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.