hw/core/loader.c: Read as long as possible in load_image_size()

Don't expect read(2) can always read as many as it's told.

CC: Richard Henderson <richard.henderson@linaro.org>
CC: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Li Zhijian 2019-01-17 20:49:02 +08:00 committed by Paolo Bonzini
parent 0c249ff71c
commit 1f40547f5c

View file

@ -77,21 +77,20 @@ int64_t get_image_size(const char *filename)
ssize_t load_image_size(const char *filename, void *addr, size_t size) ssize_t load_image_size(const char *filename, void *addr, size_t size)
{ {
int fd; int fd;
ssize_t actsize; ssize_t actsize, l = 0;
fd = open(filename, O_RDONLY | O_BINARY); fd = open(filename, O_RDONLY | O_BINARY);
if (fd < 0) { if (fd < 0) {
return -1; return -1;
} }
actsize = read(fd, addr, size); while ((actsize = read(fd, addr + l, size - l)) > 0) {
if (actsize < 0) { l += actsize;
close(fd);
return -1;
} }
close(fd); close(fd);
return actsize; return actsize < 0 ? -1 : l;
} }
/* read()-like version */ /* read()-like version */