Skip to contentSkip to conversation

unix_getname buglet - > 2.5.4(?)

PATCH Michael Meeks 3 participants 3 messages Jan 7, 2003 – Jan 9, 2003

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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 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.

Signature · 1 line
 [email protected]  <><, Pseudo Engineer, itinerant idiot
#1 lore raw
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
diff -Nurx /home/ray/work/dontdiff linux-2.5.54/net/unix/af_unix.c linux-2.5.54-af_unix.c-fix/net/unix/af_unix.c
@@ -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;
#2 lore raw
In reply to Michael Meeks
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.