Messages in this thread Patch in this message | | | Date | Tue, 5 Mar 2002 17:51:52 -0800 | Subject | [PATCH] : ir249_sock_connect_cli.diff | From | Jean Tourrilhes <> |
| |
ir249_sock_connect_cli.diff : --------------------------- o [CRITICA] Fix socket connect to remove dangerous cli() <Tested on SMP>
diff -u -p linux/net/irda/af_irda.d4.c linux/net/irda/af_irda.c --- linux/net/irda/af_irda.d4.c Tue Mar 5 16:05:10 2002 +++ linux/net/irda/af_irda.c Tue Mar 5 16:43:15 2002 @@ -1025,28 +1025,26 @@ static int irda_connect(struct socket *s /* Now the loop */ if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) return -EINPROGRESS; - - cli(); /* To avoid races on the sleep */ - - /* A Connect Ack with Choke or timeout or failed routing will go to - * closed. */ + + /* Here, there is a race condition : the state may change between + * our test and the sleep, via irda_connect_confirm(). + * The way to workaround that is to sleep with a timeout, so that + * we don't sleep forever and check the state when waking up. + * 50ms is plenty good enough, because the LAP is already connected. + * Jean II */ while (sk->state == TCP_SYN_SENT) { - interruptible_sleep_on(sk->sleep); + interruptible_sleep_on_timeout(sk->sleep, HZ/20); if (signal_pending(current)) { - sti(); return -ERESTARTSYS; } } if (sk->state != TCP_ESTABLISHED) { - sti(); sock->state = SS_UNCONNECTED; return sock_error(sk); /* Always set at this point */ } sock->state = SS_CONNECTED; - - sti(); /* At this point, IrLMP has assigned our source address */ self->saddr = irttp_get_saddr(self->tsap); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |