Просмотр исходного кода

Check to make sure that sequence ID passed into sq_item_inuse is
valid.

(Logical change 1.63)


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@226 fd59a12c-fef9-0310-b244-a6a79926bd2f

Mark Haverkamp 21 лет назад
Родитель
Сommit
502ee57750
1 измененных файлов с 12 добавлено и 0 удалено
  1. 12 0
      include/sq.h

+ 12 - 0
include/sq.h

@@ -95,9 +95,11 @@ static inline int sq_item_add (
 		return E2BIG;
 	}
 	sq_position = (sq->head + seqid - sq->head_seqid) % sq->size;
+
 //printf ("item add %d %d %d\n", sq_position, seqid, sq->head_seqid);
 	sq_item = sq->items;
 	sq_item += sq_position * sq->size_per_item;
+	assert(sq->items_inuse[sq_position] == 0);
 	memcpy (sq_item, item, sq->size_per_item);
 	sq->items_inuse[sq_position] = 1;
 
@@ -110,6 +112,16 @@ static inline int sq_item_inuse (
 
 	int sq_position;
 
+	/*
+	 * We need to say that the seqid is in use if it shouldn't 
+	 * be here in the first place.
+	 * To keep old messages from being inserted.
+	 */
+	if (seq_id < sq->head_seqid) {
+		fprintf(stderr, "sq_item_inuse: seqid %d, head %d\n", 
+						seq_id, sq->head_seqid);
+		return 1;
+	}
 	sq_position = (sq->head - sq->head_seqid + seq_id) % sq->size;
 //printf ("in use %d\n", sq_position);
 	return (sq->items_inuse[sq_position]);