not ignore other ping packets.
- STABLE14-rx-rdwr-writeproc-race-20081228: fix rx race condition that
could result in reuse of freed memory.
+ - STABLE14-rx-do-not-race-current-packet-20090105: fix rx race
+ condition.
* Make dynroot the default for new installations. It works much better
with systems that don't bring up their network until late in the boot
process, such as wireless laptops. (LP: #249240, #318605)
#endif
RCSID
- ("$Header: /cvs/openafs/src/rx/rx_rdwr.c,v 1.21.2.12 2008/12/28 21:08:13 jaltman Exp $");
+ ("$Header: /cvs/openafs/src/rx/rx_rdwr.c,v 1.21.2.13 2009/01/05 23:17:48 jaltman Exp $");
#ifdef KERNEL
#ifndef UKERNEL
osi_rxSleep(&call->rq);
#endif
}
+ /* cp is no longer valid since we may have given up the lock */
+ cp = call->currentPacket;
call->startWait = 0;
#ifdef RX_ENABLE_LOCKS
int
rxi_WritevProc(struct rx_call *call, struct iovec *iov, int nio, int nbytes)
{
- struct rx_packet *cp = call->currentPacket;
+ struct rx_packet *cp = NULL;
int nextio;
int requestCount;
struct rx_queue tmpq;
#endif /* RX_ENABLE_LOCKS */
}
#endif /* AFS_GLOBAL_RXLOCK_KERNEL */
+ /* cp is no longer valid since we may have given up the lock */
+ cp = call->currentPacket;
if (call->error) {
if (cp) {
#endif
call->startWait = 0;
}
+ /* cp is no longer valid since we may have given up the lock */
+ cp = call->currentPacket;
if (call->error) {
if (cp) {
void
rxi_FlushWrite(register struct rx_call *call)
{
- register struct rx_packet *cp = call->currentPacket;
+ register struct rx_packet *cp = NULL;
/* Free any packets from the last call to ReadvProc/WritevProc */
if (queue_IsNotEmpty(&call->iovq)) {
}
#endif /* AFS_GLOBAL_RXLOCK_KERNEL */
+ /* cp is no longer valid since we may have given up the lock */
+ cp = call->currentPacket;
+
if (cp) {
/* cp->length is only supposed to be the user's data */
/* cp->length was already set to (then-current)