[sheepdog] [PATCH] sheep: check the return value of epoch_log_read_with_timestamp() correctly

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Tue May 21 09:18:35 CEST 2013


log->nr_nodes is an unsigned integer, so we cannot use it for
assigning the negative value.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/ops.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/sheep/ops.c b/sheep/ops.c
index 9399fd8..61e6743 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -436,6 +436,8 @@ static int local_stat_cluster(struct request *req)
 	max_logs = req->rq.data_length / sizeof(*log);
 	epoch = get_latest_epoch();
 	for (i = 0; i < max_logs; i++) {
+		size_t nr_nodes;
+
 		if (epoch <= 0)
 			break;
 
@@ -443,14 +445,17 @@ static int local_stat_cluster(struct request *req)
 		memset(log, 0, sizeof(*log));
 		log->epoch = epoch;
 		log->ctime = get_cluster_ctime();
-		log->nr_nodes = epoch_log_read_with_timestamp(epoch, log->nodes,
-							sizeof(log->nodes),
-							(time_t *)&log->time);
-		if (log->nr_nodes == -1)
-			log->nr_nodes = epoch_log_read_remote(epoch, log->nodes,
-							sizeof(log->nodes),
-							(time_t *)&log->time,
-							req->vinfo);
+		nr_nodes = epoch_log_read_with_timestamp(epoch, log->nodes,
+							 sizeof(log->nodes),
+							 (time_t *)&log->time);
+		if (nr_nodes == -1)
+			nr_nodes = epoch_log_read_remote(epoch, log->nodes,
+							 sizeof(log->nodes),
+							 (time_t *)&log->time,
+							 req->vinfo);
+		assert(nr_nodes >= 0);
+		assert(nr_nodes <= SD_MAX_NODES);
+		log->nr_nodes = nr_nodes;
 
 		log->disable_recovery = sys->disable_recovery;
 
-- 
1.8.1.3.566.gaa39828



More information about the sheepdog mailing list