From 211995dc42592b16103f04c90e4479712830344e Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 16 May 2007 09:31:47 +0200 Subject: [PATCH] [libmultipath] Fix overflow in circular queue Multipathd has a circular buffer where messages are stored prior to being passed into the system logs. Under certain circumstances the circular buffer fills up; and the intention appears to be that new messages are dropped until space is freed in the buffer. However sometimes the result of a full circular buffer is to overwrite the earlier messages before they have been passed to the system buffer; resulting in the loss of early messages and corruption of later messages. Signed-off-by: Hannes Reinecke --- libmultipath/log.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libmultipath/log.c b/libmultipath/log.c index 8b339d7..90e4d1f 100644 --- a/libmultipath/log.c +++ b/libmultipath/log.c @@ -118,6 +118,11 @@ int log_enqueue (int prio, const char * fmt, va_list ap) /* not enough space on tail : rewind */ if (la->head <= la->tail && len > (la->end - la->tail)) { logdbg(stderr, "enqueue: rewind tail to %p\n", la->tail); + if (la->head == la->start ) { + logdbg(stderr, "enqueue: can not rewind tail, drop msg\n"); + la->tail = lastmsg; + return 1; /* can't reuse */ + } la->tail = la->start; if (la->empty) -- 2.7.4