diff --git a/src/sbbs3/ringbuf.c b/src/sbbs3/ringbuf.c
index 247ad9b36bd0b26ca78342ec45d4341b6f182201..fe18324ae2e408705670c911e7c32f3608442a1c 100644
--- a/src/sbbs3/ringbuf.c
+++ b/src/sbbs3/ringbuf.c
@@ -227,14 +227,12 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst,  DWORD cnt )
 {
 	DWORD max, first, remain, len;
 
-	len = RingBufFull( rb );
-	if( len == 0 )
-		return(0);
-
 #ifdef RINGBUF_MUTEX
 	pthread_mutex_lock(&rb->mutex);
 #endif
 
+	len = RINGBUF_FILL_LEVEL(rb);
+
 	if( len < cnt )
         cnt = len;
 
@@ -249,7 +247,7 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst,  DWORD cnt )
 		remain = cnt - first;
 	}
 
-    if(dst!=NULL) {
+    if(first && dst!=NULL) {
 		rb_memcpy( dst, rb->pTail, first );
 		dst += first;
     }
@@ -267,14 +265,14 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst,  DWORD cnt )
 		rb->pTail = rb->pStart;
 
 #ifdef RINGBUF_SEM		/* clear/signal semaphores, if appropriate */
-	if(len-cnt==0)		/* empty */
+	if(RINGBUF_FILL_LEVEL(rb) == 0)		/* empty */
 		sem_reset(&rb->sem);
-	if(len-cnt<rb->highwater_mark)
+	if(RINGBUF_FILL_LEVEL(rb) < rb->highwater_mark)
 		sem_reset(&rb->highwater_sem);
 #endif
 
 #ifdef RINGBUF_EVENT
-	if(rb->empty_event!=NULL && len-cnt==0)
+	if(rb->empty_event!=NULL && RINGBUF_FILL_LEVEL(rb)==0)
 		SetEvent(rb->empty_event);
 #endif