Patchwork Fix error code checking for SetFilePointer() call

login
register
mail settings
Submitter Fabien Chouteau
Date Dec. 10, 2012, 11:56 a.m.
Message ID <1355140582-5354-1-git-send-email-chouteau@adacore.com>
Download mbox | patch
Permalink /patch/204858/
State New
Headers show

Comments

Fabien Chouteau - Dec. 10, 2012, 11:56 a.m.
An error has occurred if the return value is invalid_set_file_pointer
and getlasterror doesn't return no_error.

Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
---
 block/raw-win32.c |   17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
Stefan Hajnoczi - Dec. 11, 2012, 9:21 a.m.
On Mon, Dec 10, 2012 at 12:56:22PM +0100, Fabien Chouteau wrote:
> An error has occurred if the return value is invalid_set_file_pointer
> and getlasterror doesn't return no_error.
> 
> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
> ---
>  block/raw-win32.c |   17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)

The fprintf() is kind of iffy but we only return -EIO so I guess it
helps to print the full error.

Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Kevin Wolf - Dec. 11, 2012, 10:37 a.m.
Am 11.12.2012 10:21, schrieb Stefan Hajnoczi:
> On Mon, Dec 10, 2012 at 12:56:22PM +0100, Fabien Chouteau wrote:
>> An error has occurred if the return value is invalid_set_file_pointer
>> and getlasterror doesn't return no_error.
>>
>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>> ---
>>  block/raw-win32.c |   17 ++++++++++++++---
>>  1 file changed, 14 insertions(+), 3 deletions(-)
> 
> The fprintf() is kind of iffy but we only return -EIO so I guess it
> helps to print the full error.
> 
> Acked-by: Stefan Hajnoczi <stefanha@redhat.com>

Thanks, applied to the block branch.

Kevin
Fabien Chouteau - Dec. 11, 2012, 5:44 p.m.
On 12/11/2012 10:21 AM, Stefan Hajnoczi wrote:
> The fprintf() is kind of iffy but we only return -EIO so I guess it
> helps to print the full error.

I add it because it took me a while to get to the actual error. Without
it the error message is even more cryptic:

qemu-system-ppc.exe: -hda fat:no-mbr:rw:.: could not open disk image fat:no-mbr:rw:.: Operation not permitted

At least it helps to find where the error comes from.

Patch

diff --git a/block/raw-win32.c b/block/raw-win32.c
index 0c05c58..ce207a3 100644
--- a/block/raw-win32.c
+++ b/block/raw-win32.c
@@ -303,13 +303,24 @@  static int raw_truncate(BlockDriverState *bs, int64_t offset)
 {
     BDRVRawState *s = bs->opaque;
     LONG low, high;
+    DWORD dwPtrLow;
 
     low = offset;
     high = offset >> 32;
-    if (!SetFilePointer(s->hfile, low, &high, FILE_BEGIN))
-	return -EIO;
-    if (!SetEndOfFile(s->hfile))
+
+    /*
+     * An error has occurred if the return value is INVALID_SET_FILE_POINTER
+     * and GetLastError doesn't return NO_ERROR.
+     */
+    dwPtrLow = SetFilePointer(s->hfile, low, &high, FILE_BEGIN);
+    if (dwPtrLow == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) {
+        fprintf(stderr, "SetFilePointer error: %d\n", GetLastError());
+        return -EIO;
+    }
+    if (SetEndOfFile(s->hfile) == 0) {
+        fprintf(stderr, "SetEndOfFile error: %d\n", GetLastError());
         return -EIO;
+    }
     return 0;
 }