rx-readproc32-avoid-losing-currentpacket-20080925
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 25 Sep 2008 18:06:24 +0000 (18:06 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 25 Sep 2008 18:06:24 +0000 (18:06 +0000)
LICENSE IPL10

when currentPacket is empty, avoid leaking it and instead free and NULL it

src/rx/rx_rdwr.c

index a5700e9..5baff8a 100644 (file)
@@ -325,6 +325,16 @@ rx_ReadProc(struct rx_call *call, char *buf, int nbytes)
        call->curpos = tcurpos + nbytes;
        call->curlen = tcurlen - nbytes;
        call->nLeft = tnLeft - nbytes;
+
+        if (!call->nLeft) {
+            /* out of packet.  Get another one. */
+            NETPRI;
+            MUTEX_ENTER(&call->lock);
+            rxi_FreePacket(call->currentPacket);
+            call->currentPacket = (struct rx_packet *)0;
+            MUTEX_EXIT(&call->lock);
+            USERPRI;
+        }
        return nbytes;
     }
 
@@ -373,6 +383,15 @@ rx_ReadProc32(struct rx_call *call, afs_int32 * value)
        call->curpos = tcurpos + sizeof(afs_int32);
        call->curlen = (u_short)(tcurlen - sizeof(afs_int32));
        call->nLeft = (u_short)(tnLeft - sizeof(afs_int32));
+        if (!call->nLeft) {
+            /* out of packet.  Get another one. */
+            NETPRI;
+            MUTEX_ENTER(&call->lock);
+            rxi_FreePacket(call->currentPacket);
+            call->currentPacket = (struct rx_packet *)0;
+            MUTEX_EXIT(&call->lock);
+            USERPRI;
+        }
        return sizeof(afs_int32);
     }