Hans Leidekker : msi: Improve error handling in STREAMS_set_row and add_streams_to_table.

Alexandre Julliard julliard at winehq.org
Thu Feb 4 11:11:02 CST 2010


Module: wine
Branch: master
Commit: b833ae026314306e2a18e975ff9d78444ef6d75e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b833ae026314306e2a18e975ff9d78444ef6d75e

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Feb  4 10:01:09 2010 +0100

msi: Improve error handling in STREAMS_set_row and add_streams_to_table.

---

 dlls/msi/streams.c |   32 ++++++++++++++++++++++++++------
 1 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/dlls/msi/streams.c b/dlls/msi/streams.c
index f7e8dc2..00a4544 100644
--- a/dlls/msi/streams.c
+++ b/dlls/msi/streams.c
@@ -141,7 +141,7 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
     ULONG count;
     UINT r = ERROR_FUNCTION_FAILED;
 
-    TRACE("(%p, %p)\n", view, rec);
+    TRACE("(%p, %d, %p, %08x)\n", view, row, rec, mask);
 
     if (row > sv->num_rows)
         return ERROR_FUNCTION_FAILED;
@@ -158,7 +158,10 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
     }
 
     if (stat.cbSize.QuadPart >> 32)
+    {
+        WARN("stream too large\n");
         goto done;
+    }
 
     data = msi_alloc(stat.cbSize.QuadPart);
     if (!data)
@@ -173,7 +176,10 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
 
     name = strdupW(MSI_RecordGetString(rec, 1));
     if (!name)
+    {
+        WARN("failed to retrieve stream name\n");
         goto done;
+    }
 
     r = write_stream_data(sv->db->storage, name, data, count, FALSE);
     if (r != ERROR_SUCCESS)
@@ -186,8 +192,13 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
     if (!stream)
         goto done;
 
-    IStorage_OpenStream(sv->db->storage, name, 0,
-                        STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
+    hr = IStorage_OpenStream(sv->db->storage, name, 0,
+                             STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
+    if (FAILED(hr))
+    {
+        WARN("failed to open stream: %08x\n", hr);
+        goto done;
+    }
 
     sv->streams[row] = stream;
 
@@ -204,6 +215,8 @@ static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row
 {
     MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view;
 
+    TRACE("(%p, %p, %d, %d)\n", view, rec, row, temporary);
+
     if (!streams_set_table_size(sv, ++sv->num_rows))
         return ERROR_FUNCTION_FAILED;
 
@@ -411,7 +424,7 @@ static UINT STREAMS_find_matching_rows(struct tagMSIVIEW *view, UINT col,
     MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view;
     UINT index = PtrToUlong(*handle);
 
-    TRACE("(%d, %d): %d\n", *row, col, val);
+    TRACE("(%p, %d, %d, %p, %p)\n", view, col, val, row, handle);
 
     if (col == 0 || col > NUM_STREAMS_COLS)
         return ERROR_INVALID_PARAMETER;
@@ -499,10 +512,17 @@ static INT add_streams_to_table(MSISTREAMSVIEW *sv)
             break;
         }
 
-        IStorage_OpenStream(sv->db->storage, stat.pwcsName, 0,
-                            STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
+        hr = IStorage_OpenStream(sv->db->storage, stat.pwcsName, 0,
+                                 STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
         CoTaskMemFree(stat.pwcsName);
 
+        if (FAILED(hr))
+        {
+            WARN("failed to open stream: %08x\n", hr);
+            count = -1;
+            break;
+        }
+
         if (!streams_set_table_size(sv, ++count))
         {
             count = -1;




More information about the wine-cvs mailing list