diff options
author | Pali Rohár <pali.rohar@gmail.com> | 2012-08-11 18:04:52 +0200 |
---|---|---|
committer | Pali Rohár <pali.rohar@gmail.com> | 2012-08-11 18:04:52 +0200 |
commit | 131e8bbe1fe94ba83b7f2087547d4789d3e45627 (patch) | |
tree | 9c2926b8e130d1705c397140003de66174b5f327 /src/image.c | |
parent | 0809303feb496db9b9266f9f57bdd20a629a5347 (diff) | |
download | 0xFFFF-131e8bbe1fe94ba83b7f2087547d4789d3e45627.tar.bz2 |
image: Fix image_read
Diffstat (limited to 'src/image.c')
-rw-r--r-- | src/image.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/image.c b/src/image.c index 069bc17..4857f7f 100644 --- a/src/image.c +++ b/src/image.c @@ -30,8 +30,8 @@ #include "device.h" #include "image.h" -#define IMAGE_STORE_CUR(image) do { if ( image->is_shared_fd ) { image->cur = lseek(image->fd, 0, SEEK_CUR) - image->offset; if ( image->cur >= image->size ) image->cur = image->size - 1; } } while (0) -#define IMAGE_RESTORE_CUR(image) do { if ( image->is_shared_fd ) { if ( image->cur < image->size ) lseek(image->fd, image->offset + image->cur, SEEK_SET); else lseek(image->fd, image->offset + image->size - 1, SEEK_SET); } } while (0) +#define IMAGE_STORE_CUR(image) do { if ( image->is_shared_fd ) { image->cur = lseek(image->fd, 0, SEEK_CUR) - image->offset; if ( image->cur > image->size ) image->cur = image->size; } } while (0) +#define IMAGE_RESTORE_CUR(image) do { if ( image->is_shared_fd ) { if ( image->cur <= image->size ) lseek(image->fd, image->offset + image->cur, SEEK_SET); else lseek(image->fd, image->offset + image->size, SEEK_SET); } } while (0) static void image_missing_values_from_name(struct image * image, const char * name) { @@ -208,6 +208,7 @@ struct image * image_alloc_from_file(const char * file, const char * type, const image->offset = 0; image->cur = 0; image->orig_filename = strdup(file); + lseek(image->fd, 0, SEEK_SET); image_append(image, type, device, hwrevs, version, layout); @@ -298,11 +299,12 @@ size_t image_read(struct image * image, void * buf, size_t count) { ret = read(image->fd, buf, new_count); if ( ret > 0 ) ret_count += ret; - else if ( ret < 0 ) - return ret; IMAGE_STORE_CUR(image); + if ( ret < 0 ) + return ret; + } if ( ret_count == count ) @@ -392,6 +394,7 @@ uint16_t image_hash_from_data(struct image * image) { uint16_t hash = 0; int ret; + image_seek(image, 0); while ( ( ret = image_read(image, &buf, sizeof(buf)) ) ) hash ^= do_hash((uint16_t *)&buf, ret); |