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:
parent
0c249ff71c
commit
1f40547f5c
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue