Re: [Evolution] kernel 2.5 and evolution
- From: Chris Toshok <toshok ximian com>
- To: Mika Liljeberg <mika liljeberg welho com>
- Cc: Jeffrey Stedfast <fejj ximian com>, Ronald Kuetemeier <ronald kuetemeier com>, Joaquim Fellmann <mljf altern org>, Andreas Jellinghaus <aj dungeon inka de>, Evolution <evolution ximian com>
- Subject: Re: [Evolution] kernel 2.5 and evolution
- Date: 07 Jan 2003 10:28:34 -0800
On Tue, 2003-01-07 at 08:39, Mika Liljeberg wrote:
I can't speak to what 2.5.x's output is for this program, but i bet it's
the same. If it's not it must be a bug in my code :P
According to Joaquim, and I can confirm this, Linux 2.5 returns the
following:
sock1's peer = '/tmp/sock1'
sock2's peer = '/tmp/sock2'
I have to agree that definately looks like a bug in Linux 2.5.
getpeername() seems to return the local address rather than the remote.
Ah yeah, looking at the code I *think* I see the problem. Man, as a
freebsd person I never thought I'd be mucking around with linux kernel
source :)
anyway, here's the body of unix_getname (from linux 2.5.49,
net/unix/af_unix.c) with a 1 line patch:
1110 struct sock *sk = sock->sk;
1111 struct unix_sock *u = unix_sk(sk);
1112 struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
1113 int err = 0;
1114
1115 if (peer) {
1116 sk = unix_peer_get(sk);
1117
1118 err = -ENOTCONN;
1119 if (!sk)
1120 goto out;
+ u = unix_sk (sk);
1121 err = 0;
1122 } else {
1123 sock_hold(sk);
1124 }
1125
1126 unix_state_rlock(sk);
1127 if (!u->addr) {
1128 sunaddr->sun_family = AF_UNIX;
1129 sunaddr->sun_path[0] = 0;
1130 *uaddr_len = sizeof(short);
1131 } else {
1132 struct unix_address *addr = u->addr;
1133
1134 *uaddr_len = addr->len;
1135 memcpy(sunaddr, addr->name, *uaddr_len);
1136
Please excuse the weird diff syntax, i'm using LXR since I don't have a
unix kernel tree on my machine here.
If you comment out the bind(2) call before sock1's connect(2) call then
sock2's peer shows up as "", but that's because it's not being bound.
Incidentally, orbit does *not* bind the client socket. This means that
getpeername() is *supposed* to return a zero path. Thus, zeroing the
path name is harmless. It's a valid workaround for the Linux 2.5 bug,
and merely redundant with Linux 2.4.
Hrm, yeah.
What I *don't* understand is why the orbit code calls getpeername() in
the first place. Maybe they just thought that was the easiest way to get
a valid address structure.
Yeah, that's a good question, although it does open the code up to bugs
(obviously :)
Chris
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]