unix_getname buglet - > 2.5.4(?)
Subsystems (2)
Hi there,
Evolution is non-functioning on recent 2.5.X kernels, due to
mal-performance in getpeername => net/unix/af_unix.c (unix_getname), where it seems we switch 'sk' on 'peer', but not the (previously) typecast pointer to it; this fixes it.
af_unix.c Tue Jan 7 12:00:45 2003 renamed from af_unix.c.old Tue Jan 7 11:59:09 2003 +0 -0
@@ -1097,7 +1097,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr,
int *uaddr_len, int peer)
{
struct sock *sk = sock->sk;
- struct unix_sock *u = unix_sk(sk);
+ struct unix_sock *u;
struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
int err = 0;@@ -1112,6 +1112,7 @@
sock_hold(sk);
}+ u = unix_sk(sk);
unix_state_rlock(sk);
if (!u->addr) {
sunaddr->sun_family = AF_UNIX;
Thanks Joaquim Fellmann (AFAIR) who chased this down to bitkeeperchangeset 1.262.2.2. Sadly I didn't have time to read the rest of that changeset to see if the mistake pops up elsewhere as well. Please CC me with replies, not on linux-kernel.
HTH,
Michael Meeks.
Signature · 1 line
[email protected] <><, Pseudo Engineer, itinerant idiot
Quoted 4 lines · Michael Meeks
Evolution is non-functioning on recent 2.5.X kernels, due to
mal-performance in getpeername =>net/unix/af_unix.c(unix_getname), where it seems we switch 'sk' on 'peer', but not the (previously) typecast pointer to it; this fixes it.
<snip> Your patch was MailerMangled(tm). Below is what I'm running on 2.5.54, using Evolution. The patch is obviously correct (once you look at the full code, anyway).
Linus, please apply.
Ray
net/unix/af_unix.c +2 -1
@@ -1109,7 +1109,7 @@static int unix_getname (struct socket *sock,struct sockaddr *uaddr,int *uaddr_len,int peer) {struct sock *sk = sock->sk; -struct unix_sock *u =unix_sk (sk); +struct unix_sock *u;struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;int err =0 ;
@@ -1124,6 +1124,7 @@sock_hold (sk); } + u =unix_sk (sk);unix_state_rlock (sk);if (!u->addr) { sunaddr->sun_family =AF_UNIX ;
Quoted 7 lines · Michael Meeks
Hi there,
Evolution is non-functioning on recent 2.5.X kernels, due to
mal-performance in getpeername =>net/unix/af_unix.c(unix_getname), where it seems we switch 'sk' on 'peer', but not the (previously) typecast pointer to it; this fixes it.
<snip>
Quoted 8 lines
Thanks Joaquim Fellmann (AFAIR) who chased this down to bitkeeper
changeset 1.262.2.2. Sadly I didn't have time to read the rest of that changeset to see if the mistake pops up elsewhere as well. Please CC me with replies, not on linux-kernel.HTH,
Michael Meeks.
http://marc.theaimsgroup.com/?l=linux-kernel&m=103462833225515&w=2
Thanks for the fix!
Keep up the great work, Ximian dudes and dudettes.