[sheepdog] [PATCH v2] sheep/store: add epoch file length checking

Ruoyu liangry at ucweb.com
Mon Jul 28 05:25:37 CEST 2014


If epoch file length is shorter than size of time due to file broken,
epoch_stat.st_size - sizeof(*timestamp) is negative. However,
the third parameter of function xread will get it as type size_t,
then xread will think there are many data to be read. Therefore,
a file length checking to prevent this situation is needed.

v2 does nothing changed logically but uses a variable to store
the value of the express 'epoch_stat.st_size - sizeof(*timestamp)'

Signed-off-by: Ruoyu <liangry at ucweb.com>
---
 sheep/store.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/sheep/store.c b/sheep/store.c
index eee88c7..eb42f2c 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -44,7 +44,7 @@ int update_epoch_log(uint32_t epoch, struct sd_node *nodes, size_t nr_nodes)
 static int do_epoch_log_read(uint32_t epoch, struct sd_node *nodes, int len,
 			     time_t *timestamp)
 {
-	int fd, ret, nr_nodes;
+	int fd, ret, nr_nodes, buf_len;
 	char path[PATH_MAX];
 	struct stat epoch_stat;
 
@@ -62,12 +62,13 @@ static int do_epoch_log_read(uint32_t epoch, struct sd_node *nodes, int len,
 		goto err;
 	}
 
-	if (len < epoch_stat.st_size - sizeof(*timestamp)) {
+	buf_len = epoch_stat.st_size - sizeof(*timestamp);
+	if (buf_len < 0 || len < buf_len) {
 		sd_err("invalid epoch %"PRIu32" log", epoch);
 		goto err;
 	}
 
-	ret = xread(fd, nodes, epoch_stat.st_size - sizeof(*timestamp));
+	ret = xread(fd, nodes, buf_len);
 	if (ret < 0) {
 		sd_err("failed to read epoch %"PRIu32" log, %m", epoch);
 		goto err;
-- 
1.8.3.2





More information about the sheepdog mailing list