Commit 1a45246b authored by Poul-Henning Kamp's avatar Poul-Henning Kamp Committed by Tollef Fog Heen

Fix the boundary detection code in vsl.c, slightly more paranoid than

DocWilcos proposed fix in #956
parent 38dd2742
...@@ -173,20 +173,30 @@ vsl_nextlog(struct vsl *vsl, uint32_t **pp) ...@@ -173,20 +173,30 @@ vsl_nextlog(struct vsl *vsl, uint32_t **pp)
for (w = 0; w < TIMEOUT_USEC;) { for (w = 0; w < TIMEOUT_USEC;) {
t = *vsl->log_ptr; t = *vsl->log_ptr;
if (t == VSL_WRAPMARKER || if (t == VSL_WRAPMARKER) {
(t == VSL_ENDMARKER && vsl->last_seq != vsl->log_start[0])) { /* Wrap around not possible at front */
assert(vsl->log_ptr != vsl->log_start + 1);
vsl->log_ptr = vsl->log_start + 1; vsl->log_ptr = vsl->log_start + 1;
vsl->last_seq = vsl->log_start[0];
VRMB(); VRMB();
continue; continue;
} }
if (t == VSL_ENDMARKER) { if (t == VSL_ENDMARKER) {
if (vsl->log_ptr != vsl->log_start + 1 &&
vsl->last_seq != vsl->log_start[0]) {
/* ENDMARKER not at front and seq wrapped */
vsl->log_ptr = vsl->log_start + 1;
VRMB();
continue;
}
if (vsl->flags & F_NON_BLOCKING) if (vsl->flags & F_NON_BLOCKING)
return (-1); return (-1);
w += SLEEP_USEC; w += SLEEP_USEC;
assert(usleep(SLEEP_USEC) == 0 || errno == EINTR); assert(usleep(SLEEP_USEC) == 0 || errno == EINTR);
continue; continue;
} }
if (vsl->log_ptr == vsl->log_start + 1)
vsl->last_seq = vsl->log_start[0];
*pp = (void*)(uintptr_t)vsl->log_ptr; /* Loose volatile */ *pp = (void*)(uintptr_t)vsl->log_ptr; /* Loose volatile */
vsl->log_ptr = VSL_NEXT(vsl->log_ptr); vsl->log_ptr = VSL_NEXT(vsl->log_ptr);
return (1); return (1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment