From: Denys V. <dvl...@re...> - 2008-11-25 16:00:43
|
Hi, Before this patch strace on x86_64, when stracing 32-bit app, shows fcntl(F_SETLK) incorrectly: # cat -n testfcntl.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <errno.h> 6 #include <fcntl.h> 7 8 int main(int argc, char **argv) 9 { 10 int filedes; 11 struct flock flockstruct; 12 13 filedes = open("./testfile.txt", O_RDWR | O_CREAT | O_TRUNC); 14 if (filedes < 0) { 15 perror("Unable to open file"); 16 return 1; 17 } 18 printf("File exists\n"); 19 flockstruct.l_type = F_WRLCK; 20 flockstruct.l_whence = SEEK_SET; 21 flockstruct.l_start = 0; 22 flockstruct.l_len = 0; 23 if ((fcntl(filedes, F_SETLK, &flockstruct)) == -1) { 24 printf("Lock failed!\n"); 25 return 1; 26 } 27 printf("Lock worked\n"); 28 return 0; 29 } # i486-linux-uclibc-gcc -Os testfcntl.c # strace ./a.out execve("./a.out", ["./a.out"], [/* 55 vars */]) = 0 [ Process PID=17315 runs in 32 bit mode. ] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 open("./testfile.txt", O_RDWR|O_CREAT|O_TRUNC, 02703611000) = 4 write(1, "File exists\n", 12File exists ) = 12 fcntl(4, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=0, len=4294892232}) = 0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ write(1, "Lock worked\n", 12Lock worked ) = 12 _exit(0) = ? Patched strace: # ./strace ./a.out execve("./a.out", ["./a.out"], [/* 55 vars */]) = 0 [ Process PID=16942 runs in 32 bit mode. ] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 open("./testfile.txt", O_RDWR|O_CREAT|O_TRUNC, 02703611000) = 4 write(1, "File exists\n", 12File exists ) = 12 fcntl(4, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ write(1, "Lock worked\n", 12Lock worked ) = 12 _exit(0) = ? Patch is below. Please apply. -- vda diff -d -urpN strace.0/desc.c strace.1/desc.c --- strace.0/desc.c 2008-11-10 23:53:02.000000000 +0100 +++ strace.1/desc.c 2008-11-25 13:50:19.000000000 +0100 @@ -200,8 +200,39 @@ int getlk; { struct flock fl; - if (umove(tcp, addr, &fl) < 0) { - tprintf("{...}"); + if (personality_wordsize[current_personality] == sizeof(fl.l_start)) + { + if (umove(tcp, addr, &fl) < 0) + { + tprintf("{...}"); + return; + } + } + else if (personality_wordsize[current_personality] == 4) + { + /* 32-bit x86 app on x86_64 and similar cases */ + struct { + short int l_type; + short int l_whence; + int32_t l_start; /* off_t */ + int32_t l_len; /* off_t */ + int32_t l_pid; /* pid_t */ + } fl32; + if (umove(tcp, addr, &fl32) < 0) + { + tprintf("{...}"); + return; + } + fl.l_type = fl32.l_type; + fl.l_whence = fl32.l_whence; + fl.l_start = fl32.l_start; + fl.l_len = fl32.l_len; + fl.l_pid = fl32.l_pid; + } + else { + /* let people know we have a problem here */ + tprintf("{ <decode error: unsupported wordsize %d> }", + personality_wordsize[current_personality]); return; } tprintf("{type="); |