Public bug reported: NB: filing this kernel bug against Canonical because the 3.5.0 kernel isn't officially suported upstream [1].
== Steps to reproduce == 0. Follow these steps on an *x86* installation; *not* x86-64. 1. Download the first attachment "Small test case ..." as pwrite64_testcase.c 2. Download the second attachment "ptrace tracer ..." as regtrace.c 3. Compile both files $ gcc -g -o pwrite64_testcase pwrite64_testcase.c $ gcc -g -o regtrace regtrace.c 4. Verify the files were compiled correctly $ file regtrace You should see output like regtrace: ELF 32-bit LSB executable, Intel 80386... 5. Run the command $ ./regtrace ./pwrite64_testcase | grep -A1 181: == Expected behavior == Step (5) above should print output that looks something like 181: eax:0xffffffda ebx:0x3 ecx:0xff9cde0f edx:0x19 [-->]esi:0xa edi:0x0 ebp:0xff9cde48 eip:0x80486f5 181: eax:0x19 ebx:0x3 ecx:0xff9cde0f edx:0x19 [-->]esi:0xa edi:0x0 ebp:0xff9cde48 eip:0x80486f5 Notice the "esi:..." values, marked with "[-->]", are both "0xa" in both the entry and exit trace line. == Actual behavior == Step (5) produces output that looks like 181: eax:0xffffffda ebx:0x4 ecx:0xbffff60a edx:0x19 [-->]esi:0xa edi:0x0 ebp:0xbffff658 eip:0x80488c5 181: eax:0x19 ebx:0x4 ecx:0xbffff60a edx:0x19 [-->]esi:0x23 edi:0x0 ebp:0xbffff658 eip:0x80488c5 Notice that the "esi:..." values are *NOT* the same: in the entry trace line, esi is "0xa" (the correct value). But in the exit trace line, esi is "0x23" (INCORRECT). == Brief description == The regtrace.c program dumps its tracee's registers at all syscall entry and exits. Per the kernel ABI, all register values *except* eax (return value) are preserved across syscall entry/exit. The pwrite64_testcase.c program uses the pwrite64 and pread64 syscalls in a very basic manner. The symptom is that the regtrace program seems to show a violation of the kernel ABI, as described above: the esi value (as reported by ptrace) changes across syscall entry/exit. This could either be a ptrace bug, or a bug somewhere else in the kernel, but to userspace the symptom looks the same. Three kernel builds were tested. Interestingly, the kernel only appears in an x86 kernel. * x86, 3.5.0-36: *SHOWS* the bug * x86-64, 3.5.0-36: does *NOT* show the bug * x86-64, 3.9.11: does *NOT* show the bug If it helps clarify the nature of the bug, here's a patch that was landed to work around it https://github.com/mozilla/rr/commit/0d585a0242d8771b7830621ff82abf75976b743b == System and package information == $ lsb_release -rd Description: Ubuntu 12.04.2 LTS Release: 12.04 $ apt-cache policy linux-image-3.5.0-36-generic linux-image-3.5.0-36-generic: Installed: 3.5.0-36.57~precise1 Candidate: 3.5.0-36.57~precise1 Version table: *** 3.5.0-36.57~precise1 0 500 http://us.archive.ubuntu.com/ubuntu/ precise-updates/main i386 Packages 100 /var/lib/dpkg/status $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 42 model name : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz [1] https://www.kernel.org/ ** Affects: linux-lts-quantal (Ubuntu) Importance: Undecided Status: New ** Attachment added: "Small test case that invokes pwrite64 and pread64" https://bugs.launchpad.net/bugs/1206746/+attachment/3755389/+files/pwrite64_testcase.c -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1206746 Title: ptrace shows esi mutation across pread64 and pwrite64 syscalls To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/linux-lts-quantal/+bug/1206746/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs