From 1856684d6f63a5028109f87f9f30fe0b2d495937 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 6 Dec 2012 16:29:06 +0100 Subject: wine bug: accessing name in streams_view_set_row even if mask&1 == 0 --- libmsi/storages.c | 19 ++++++++++++++++--- libmsi/streams.c | 23 +++++++++++++++++------ 2 files changed, 33 insertions(+), 9 deletions(-) (limited to 'libmsi') diff --git a/libmsi/storages.c b/libmsi/storages.c index 529653e..471091d 100644 --- a/libmsi/storages.c +++ b/libmsi/storages.c @@ -112,6 +112,7 @@ static unsigned storages_view_get_row( LibmsiView *view, unsigned row, LibmsiRec static unsigned storages_view_set_row(LibmsiView *view, unsigned row, LibmsiRecord *rec, unsigned mask) { LibmsiStorageView *sv = (LibmsiStorageView *)view; + STORAGE *storage; GsfInput *stm; char *name = NULL; unsigned r = LIBMSI_RESULT_FUNCTION_FAILED; @@ -125,7 +126,17 @@ static unsigned storages_view_set_row(LibmsiView *view, unsigned row, LibmsiReco if (r != LIBMSI_RESULT_SUCCESS) return r; - name = strdup(_libmsi_record_get_string_raw(rec, 1)); + if (sv->storages[row]) { + if (mask & 1) { + FIXME("renaming storage via UPDATE on _Storages table\n"); + goto done; + } + + storage = sv->storages[row]; + name = strdup(msi_string_lookup_id(sv->db->strings, storage->str_index)); + } else { + name = strdup(_libmsi_record_get_string_raw(rec, 1)); + } if (!name) { r = LIBMSI_RESULT_OUTOFMEMORY; @@ -133,10 +144,12 @@ static unsigned storages_view_set_row(LibmsiView *view, unsigned row, LibmsiReco } msi_create_storage(sv->db, name, stm); - sv->storages[row] = create_storage(sv, name); - if (!sv->storages[row]) + storage = create_storage(sv, name); + if (!storage) r = LIBMSI_RESULT_FUNCTION_FAILED; + sv->storages[row] = storage; + done: msi_free(name); g_object_unref(G_OBJECT(stm)); diff --git a/libmsi/streams.c b/libmsi/streams.c index 39e2630..d5d2aa5 100644 --- a/libmsi/streams.c +++ b/libmsi/streams.c @@ -141,14 +141,25 @@ static unsigned streams_view_set_row(LibmsiView *view, unsigned row, LibmsiRecor if (r != LIBMSI_RESULT_SUCCESS) return r; - name = strdup(_libmsi_record_get_string_raw(rec, 1)); - if (!name) - { - WARN("failed to retrieve stream name\n"); - goto done; + if (sv->streams[row]) { + if (mask & 1) { + FIXME("renaming stream via UPDATE on _Streams table"); + goto done; + } + + stream = sv->streams[row]; + name = strdup(msi_string_lookup_id(sv->db->strings, stream->str_index)); + } else { + name = strdup(_libmsi_record_get_string_raw(rec, 1)); + if (!name) + { + WARN("failed to retrieve stream name\n"); + goto done; + } + + stream = create_stream(sv, name, false, stm); } - stream = create_stream(sv, name, false, stm); if (!stream) goto done; -- cgit