diff -r 44fc5f94bc90 Lib/test/test_msilib.py --- a/Lib/test/test_msilib.py Mon Apr 04 01:22:06 2011 +0200 +++ b/Lib/test/test_msilib.py Mon Apr 04 10:36:50 2011 +0800 @@ -3,6 +3,15 @@ import os from test.support import run_unittest, import_module msilib = import_module('msilib') +import msilib.schema + + +def initialize_test_db(): + path = os.path.join(os.path.dirname(__file__), "test.msi") + db = msilib.init_database( + path, msilib.schema, "Python Tests", "product_code", "1.0", "PSF") + return db, path + class Test_make_id(unittest.TestCase): #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx @@ -39,6 +48,35 @@ msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt") +class TestSummaryInformation(unittest.TestCase): + + def test_issue1104(self): + # msilib.SummaryInfo.GetProperty() truncates the string by one character + db, db_path = initialize_test_db() + try: + sum_info = db.GetSummaryInformation(99) + title = sum_info.GetProperty(msilib.PID_TITLE) + self.assertEqual(title, b"Installation Database") + + # the start buffer is 1000 chars long - so test some boundary + # conditions + sum_info.SetProperty(msilib.PID_TITLE, "a" * 999) + title = sum_info.GetProperty(msilib.PID_TITLE) + self.assertEqual(title, b"a" * 999) + + sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000) + title = sum_info.GetProperty(msilib.PID_TITLE) + self.assertEqual(title, b"a" * 1000) + + sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001) + title = sum_info.GetProperty(msilib.PID_TITLE) + self.assertEqual(title, b"a" * 1001) + finally: + db = None + sum_info = None + os.unlink(db_path) + + def test_main(): run_unittest(__name__) diff -r 44fc5f94bc90 PC/_msi.c --- a/PC/_msi.c Mon Apr 04 01:22:06 2011 +0200 +++ b/PC/_msi.c Mon Apr 04 10:36:50 2011 +0800 @@ -534,7 +534,7 @@ FILETIME fval; char sbuf[1000]; char *sval = sbuf; - DWORD ssize = sizeof(sval); + DWORD ssize = sizeof(sbuf); if (!PyArg_ParseTuple(args, "i:GetProperty", &field)) return NULL; @@ -542,6 +542,7 @@ status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival, &fval, sval, &ssize); if (status == ERROR_MORE_DATA) { + ssize++; sval = malloc(ssize); status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival, &fval, sval, &ssize); @@ -554,7 +555,7 @@ PyErr_SetString(PyExc_NotImplementedError, "FILETIME result"); return NULL; case VT_LPSTR: - result = PyBytes_FromStringAndSize(sval, ssize); + result = PyBytes_FromString(sval); if (sval != sbuf) free(sval); return result;