Module: wine Branch: master Commit: 533833b4e154782d1d05ac9c1bdc17e0af4be4d4 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=533833b4e154782d1d05ac9c...
Author: Mike McCormack mike@codeweavers.com Date: Thu Aug 31 17:06:20 2006 +0900
msi: Validate database fields before inserting them.
---
dlls/msi/table.c | 39 +++++++++++++++++++++++++++++++++++---- dlls/msi/tests/db.c | 5 +---- 2 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/dlls/msi/table.c b/dlls/msi/table.c index fb468bc..51986d7 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -1302,12 +1302,38 @@ static UINT msi_table_find_row( MSITABLE
static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) { - UINT r, row; + UINT r, row, i;
+ /* check there's no null values where they're not allowed */ + for( i = 0; i < tv->num_cols; i++ ) + { + if ( tv->columns[i].type & MSITYPE_NULLABLE ) + continue; + + if ( tv->columns[i].type & MSITYPE_STRING ) + { + LPCWSTR str; + + str = MSI_RecordGetString( rec, i+1 ); + if (str == NULL || str[0] == 0) + return ERROR_INVALID_DATA; + } + else + { + UINT n; + + n = MSI_RecordGetInteger( rec, i+1 ); + if (n == MSI_NULL_INTEGER) + return ERROR_INVALID_DATA; + } + } + + /* check there's no duplicate keys */ r = msi_table_find_row( tv, rec, &row ); - if (r != ERROR_SUCCESS) - return ERROR_SUCCESS; - return ERROR_INVALID_DATA; + if (r == ERROR_SUCCESS) + return ERROR_INVALID_DATA; + + return ERROR_SUCCESS; }
static UINT msi_table_modify_row( MSITABLEVIEW *tv, MSIRECORD *rec, @@ -1352,6 +1378,11 @@ static UINT TABLE_insert_row( struct tag
TRACE("%p %p\n", tv, rec );
+ /* check that the key is unique - can we find a matching row? */ + r = table_validate_new( tv, rec ); + if( r != ERROR_SUCCESS ) + return ERROR_FUNCTION_FAILED; + r = table_create_new_row( view, &row ); TRACE("insert_row returned %08x\n", r); if( r != ERROR_SUCCESS ) diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index c8d42f9..a35b685 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -1323,10 +1323,7 @@ static void test_markers(void) MsiRecordSetString(rec, 3, "haha"); query = "INSERT INTO `?` ( `One`, `Two` ) VALUES ( ?, '?' )"; r = run_query(hdb, rec, query); - todo_wine - { - ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %d\n", r); - } + ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %d\n", r);
/* try all markers */ MsiCloseHandle(rec);