summaryrefslogtreecommitdiffstats
path: root/src/image.c
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2012-08-11 18:04:52 +0200
committerPali Rohár <pali.rohar@gmail.com>2012-08-11 18:04:52 +0200
commit131e8bbe1fe94ba83b7f2087547d4789d3e45627 (patch)
tree9c2926b8e130d1705c397140003de66174b5f327 /src/image.c
parent0809303feb496db9b9266f9f57bdd20a629a5347 (diff)
download0xFFFF-131e8bbe1fe94ba83b7f2087547d4789d3e45627.tar.bz2
image: Fix image_read
Diffstat (limited to 'src/image.c')
-rw-r--r--src/image.c11
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);