From 29f5cd2335750580f5646ebd3eace69d1ea79329 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 3 Sep 2012 10:19:09 +0200 Subject: [PATCH] Fix return value of fdio fread(3) and fwrite(3). Previously fread and fwrite for file descriptors would return the number of bytes read/written rather than the number of elements read/written. This breaks the C standard and broke various third party programs such as readelf from binutils. --- libmaxsi/fdio.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libmaxsi/fdio.c b/libmaxsi/fdio.c index e4888ac0..9b8a456b 100644 --- a/libmaxsi/fdio.c +++ b/libmaxsi/fdio.c @@ -52,11 +52,11 @@ static size_t fdio_read(void* ptr, size_t size, size_t nmemb, void* user) while ( sofar < total ) { ssize_t numbytes = read(fdio->fd, buf + sofar, total - sofar); - if ( numbytes < 0 ) { fdio->flags |= FDIO_ERROR; return sofar; } - if ( numbytes == 0 ) { fdio->flags |= FDIO_EOF; return sofar; } + if ( numbytes < 0 ) { fdio->flags |= FDIO_ERROR; break; } + if ( numbytes == 0 ) { fdio->flags |= FDIO_EOF; break; } sofar += numbytes; } - return sofar; + return sofar / size; } static size_t fdio_write(const void* ptr, size_t size, size_t nmemb, void* user) @@ -69,10 +69,11 @@ static size_t fdio_write(const void* ptr, size_t size, size_t nmemb, void* user) while ( sofar < total ) { ssize_t numbytes = write(fdio->fd, buf + sofar, total - sofar); - if ( numbytes < 0 ) { fdio->flags |= FDIO_ERROR; return sofar; } + if ( numbytes < 0 ) { fdio->flags |= FDIO_ERROR; break; } + if ( numbytes == 0 ) { fdio->flags |= FDIO_EOF; break; } sofar += numbytes; } - return sofar; + return sofar / size; } static int fdio_seek(void* user, off_t offset, int whence)