From: Jacek Konieczny <jajcus@jajcus.net>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: Olaf Hering <olaf@aepfle.de>,
"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [PATCH] Fix locking in tools/hotplug/Linux/locking.sh
Date: Tue, 13 Nov 2012 14:27:35 +0100 [thread overview]
Message-ID: <20121113132735.GD7561@jajo.eggsoft> (raw)
In-Reply-To: <1352804909.7491.55.camel@zakaz.uk.xensource.com>
On Tue, Nov 13, 2012 at 11:08:29AM +0000, Ian Campbell wrote:
> On Mon, 2012-11-12 at 18:40 +0000, Olaf Hering wrote:
> > On Mon, Nov 12, Jacek Konieczny wrote:
> >
> > > # perl --version
> > > This is perl, v5.8.8 built for x86_64-pld-linux-thread-multi
> >
> > sles11sp2 has perl 5.10.0, maybe there is different behaviour in
> > different perl versions.
>
> More likely to be the kernel, since Perl would have to jump through
> hoops to figure out if a random fd which it got passed was r/o or r/w, I
> think.
I suspected my perl just checks the file descriptor which is to be
opened for reading, and it seems to be the case.
…however, after looking into Perl source code it seems it might be
glibc and its fdopen() implementation, as Perl calls fdopen() (unless
'sfio' is used instead of 'stdio').
And from the fdopen(3) manual:
> The mode of the stream (one of the values "r", "r+", "w", "w+",
> "a", "a+") must be compatible with the mode of the file descriptor.
# rpm -q glibc
glibc-2.15-10.aos1.x86_64
> Perhaps its a security thing (e.g. selinux or something like that)
> enforcing something extra?
Nothing like that here.
>
> Might be interesting to run things under strace ?
Here you are, (notice the fcntl(3, F_GETFL) call before the error):
+ _lockfd=42
+ _lockfile=/tmp/lockfile
+ eval 'exec 42>>/tmp/lockfile'
++ exec
+ flock -x 42
++ strace perl -e '
open STDIN, "<&42" or die $!;
my $fd_inum = (stat STDIN)[1]; die $! unless defined $fd_inum;
my $file_inum = (stat $ARGV[0])[1];
print "y\n" if $fd_inum eq $file_inum;
' /tmp/lockfile
execve("/usr/bin/perl", ["perl", "-e", "\n open STDIN, \"<&42\" "..., "/tmp/lockfile"], [/* 28 vars */]) = 0
brk(0) = 0x1c01000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae6c000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/tls/x86_64/libperl.so.5.8.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/tls/x86_64", 0x7fff5242d820) = -1 ENOENT (No such file or directory)
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/tls/libperl.so.5.8.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/tls", 0x7fff5242d820) = -1 ENOENT (No such file or directory)
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/x86_64/libperl.so.5.8.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/x86_64", 0x7fff5242d820) = -1 ENOENT (No such file or directory)
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/libperl.so.5.8.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@Y\3\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1425032, ...}) = 0
mmap(NULL, 3528768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f217a8ee000
mprotect(0x7f217aa40000, 2093056, PROT_NONE) = 0
mmap(0x7f217ac3f000, 45056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x151000) = 0x7f217ac3f000
mmap(0x7f217ac4a000, 6208, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f217ac4a000
close(3) = 0
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=24104, ...}) = 0
mmap(NULL, 24104, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f217ae66000
close(3) = 0
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=14672, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae65000
mmap(NULL, 2109688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f217a6ea000
mprotect(0x7f217a6ec000, 2097152, PROT_NONE) = 0
mmap(0x7f217a8ec000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f217a8ec000
close(3) = 0
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260U\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=997640, ...}) = 0
mmap(NULL, 3092776, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f217a3f6000
mprotect(0x7f217a4e9000, 2093056, PROT_NONE) = 0
mmap(0x7f217a6e8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf2000) = 0x7f217a6e8000
close(3) = 0
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`m\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=135433, ...}) = 0
mmap(NULL, 2212784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f217a1d9000
mprotect(0x7f217a1f1000, 2093056, PROT_NONE) = 0
mmap(0x7f217a3f0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7f217a3f0000
mmap(0x7f217a3f2000, 13232, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f217a3f2000
close(3) = 0
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\25\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1728816, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae64000
mmap(NULL, 3841120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2179e2f000
mprotect(0x7f2179fcf000, 2097152, PROT_NONE) = 0
mmap(0x7f217a1cf000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a0000) = 0x7f217a1cf000
mmap(0x7f217a1d5000, 15456, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f217a1d5000
close(3) = 0
open("/usr/lib64/perl5/5.8.8/x86_64-pld-linux-thread-multi/CORE/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\n\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=47280, ...}) = 0
mmap(NULL, 2331072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2179bf5000
mprotect(0x7f2179c00000, 2093056, PROT_NONE) = 0
mmap(0x7f2179dff000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa000) = 0x7f2179dff000
mmap(0x7f2179e01000, 184768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2179e01000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae63000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae62000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae61000
arch_prctl(ARCH_SET_FS, 0x7f217ae62700) = 0
mprotect(0x7f217a1cf000, 16384, PROT_READ) = 0
mprotect(0x7f2179dff000, 4096, PROT_READ) = 0
mprotect(0x7f217a3f0000, 4096, PROT_READ) = 0
mprotect(0x7f217a6e8000, 4096, PROT_READ) = 0
mprotect(0x7f217a8ec000, 4096, PROT_READ) = 0
mprotect(0x7f217ac3f000, 12288, PROT_READ) = 0
mprotect(0x603000, 4096, PROT_READ) = 0
mprotect(0x7f217ae6d000, 4096, PROT_READ) = 0
munmap(0x7f217ae66000, 24104) = 0
set_tid_address(0x7f217ae629d0) = 30903
set_robust_list(0x7f217ae629e0, 0x18) = 0
futex(0x7fff5242e07c, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7fff5242e07c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f217ae62700) = -1 EAGAIN (Resource temporarily unavailable)
rt_sigaction(SIGRTMIN, {0x7f217a1df7c0, [], SA_RESTORER|SA_SIGINFO, 0x7f217a1e8de0}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x7f217a1df850, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f217a1e8de0}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
rt_sigaction(SIGFPE, {SIG_IGN, [FPE], SA_RESTORER|SA_RESTART, 0x7f2179e63d00}, {SIG_DFL, [], 0}, 8) = 0
brk(0) = 0x1c01000
brk(0x1c23000) = 0x1c23000
getuid() = 0
geteuid() = 0
getgid() = 0
getegid() = 0
open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2223712, ...}) = 0
mmap(NULL, 2223712, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f21799d6000
close(3) = 0
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae40000
open("/dev/urandom", O_RDONLY) = 3
read(3, "^nbc", 4) = 4
close(3) = 0
open("/dev/null", O_RDONLY) = 3
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
readlink("/proc/self/exe", "/usr/bin/perl5.8.8", 4095) = 18
brk(0x1c44000) = 0x1c44000
getppid() = 30902
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff5242d618) = -1 ENOTTY (Inappropriate ioctl for device)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f217ae6b000
lseek(3, 0, SEEK_CUR) = 0
lseek(3, 0, SEEK_SET) = 0
close(3) = 0
munmap(0x7f217ae6b000, 4096) = 0
dup(42) = 3
fcntl(3, F_GETFL) = 0x8401 (flags O_WRONLY|O_APPEND|O_LARGEFILE)
close(3) = 0
write(2, "Invalid argument at -e line 2.\n", 31Invalid argument at -e line 2.
) = 31
exit_group(22) = ?
+ rightfile=
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2012-11-13 13:27 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-09 13:56 [PATCH] Fix locking in tools/hotplug/Linux/locking.sh Jacek Konieczny
2012-11-12 16:42 ` Ian Campbell
2012-11-12 18:05 ` Jacek Konieczny
2012-11-12 18:07 ` Olaf Hering
2012-11-12 18:34 ` Jacek Konieczny
2012-11-12 18:40 ` Olaf Hering
2012-11-13 11:08 ` Ian Campbell
2012-11-13 13:27 ` Jacek Konieczny [this message]
2012-11-13 16:21 ` Ian Jackson
2012-11-13 16:25 ` Ian Campbell
2012-11-14 10:24 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121113132735.GD7561@jajo.eggsoft \
--to=jajcus@jajcus.net \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=olaf@aepfle.de \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).