[sheepdog] [PATCH v2] sheep/store: add epoch file length checking
Hitoshi Mitake
mitake.hitoshi at lab.ntt.co.jp
Mon Jul 28 05:56:58 CEST 2014
At Mon, 28 Jul 2014 11:25:37 +0800,
Ruoyu wrote:
>
> 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(-)
Applied, thanks.
Hitoshi
>
> 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
>
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list