msxml3: It's not a failure to get S_FALSE from IStream::Read().
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 5bf6eda..f5ec672 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -1873,14 +1873,14 @@
     HRESULT hr;
     ULONG dataRead;
     char data[1024];
+    int ret;
 
+    dataRead = 0;
     hr = IStream_Read(stream, data, sizeof(data), &dataRead);
-    if(hr != S_OK)
-        return hr;
+    if(FAILED(hr)) return hr;
 
     hr = SAXLocator_create(This, &locator, vbInterface);
-    if(FAILED(hr))
-        return hr;
+    if(FAILED(hr)) return hr;
 
     locator->pParserCtxt = xmlCreatePushParserCtxt(
             &locator->saxreader->sax, locator,
@@ -1892,25 +1892,34 @@
     }
 
     This->isParsing = TRUE;
-    while(1)
+
+    if(dataRead != sizeof(data))
     {
-        hr = IStream_Read(stream, data, sizeof(data), &dataRead);
-        if(hr != S_OK)
-            break;
-
-        if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0) != XML_ERR_OK) hr = E_FAIL;
-        else hr = locator->ret;
-
-        if(hr != S_OK) break;
-
-        if(dataRead != sizeof(data))
+        ret = xmlParseChunk(locator->pParserCtxt, data, 0, 1);
+        hr = ret != XML_ERR_OK ? E_FAIL : locator->ret;
+    }
+    else
+    {
+        while(1)
         {
-            if(xmlParseChunk(locator->pParserCtxt, data, 0, 1) != XML_ERR_OK) hr = E_FAIL;
-            else hr = locator->ret;
+            dataRead = 0;
+            hr = IStream_Read(stream, data, sizeof(data), &dataRead);
+            if (FAILED(hr)) break;
 
-            break;
+            ret = xmlParseChunk(locator->pParserCtxt, data, dataRead, 0);
+            hr = ret != XML_ERR_OK ? E_FAIL : locator->ret;
+
+            if (hr != S_OK) break;
+
+            if (dataRead != sizeof(data))
+            {
+                ret = xmlParseChunk(locator->pParserCtxt, data, 0, 1);
+                hr = ret != XML_ERR_OK ? E_FAIL : locator->ret;
+                break;
+            }
         }
     }
+
     This->isParsing = FALSE;
 
     xmlFreeParserCtxt(locator->pParserCtxt);