Commit d5409eb6 authored by Tzu-ping Chung's avatar Tzu-ping Chung Committed by Miss Islington (bot)

[2.7] bpo-1104: msilib.SummaryInfo.GetProperty() truncates the string by one...

[2.7] bpo-1104: msilib.SummaryInfo.GetProperty() truncates the string by one character (GH-4517) (GH-11749)



Add one char to MsiSummaryInfoGetProperty() output
Based on the patch in [bpo-1104](https://bugs.python.org/issue1104) by Anthony Tuininga (atuining) and Mark McMahon (markm)
(cherry picked from commit 2de576e1)
Co-authored-by: default avatarTzu-ping Chung <uranusjr@gmail.com>





https://bugs.python.org/issue1104
parent 49778ada
""" Test suite for the code in msilib """ """ Test suite for the code in msilib """
import unittest import unittest
import os from test_support import TESTFN, import_module, run_unittest, unlink
from test_support import run_unittest, import_module
msilib = import_module('msilib') msilib = import_module('msilib')
import msilib.schema
def init_database():
path = TESTFN + '.msi'
db = msilib.init_database(
path,
msilib.schema,
'Python Tests',
'product_code',
'1.0',
'PSF',
)
return db, path
class MsiDatabaseTestCase(unittest.TestCase):
def test_summaryinfo_getproperty_issue1104(self):
db, db_path = init_database()
try:
sum_info = db.GetSummaryInformation(99)
title = sum_info.GetProperty(msilib.PID_TITLE)
self.assertEqual(title, b"Installation Database")
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
unlink(db_path)
class Test_make_id(unittest.TestCase): class Test_make_id(unittest.TestCase):
#http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
...@@ -35,12 +75,13 @@ class Test_make_id(unittest.TestCase): ...@@ -35,12 +75,13 @@ class Test_make_id(unittest.TestCase):
def test_invalid_any_char(self): def test_invalid_any_char(self):
self.assertEqual( self.assertEqual(
msilib.make_id(".s\x82ort"), "_.s_ort") msilib.make_id(".s\x82ort"), "_.s_ort")
self.assertEqual ( self.assertEqual(
msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt") msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
def test_main(): def test_main():
run_unittest(__name__) run_unittest(__name__)
if __name__ == '__main__': if __name__ == '__main__':
test_main() test_main()
Correctly handle string length in ``msilib.SummaryInfo.GetProperty()`` to
prevent it from truncating the last character.
...@@ -539,7 +539,7 @@ summary_getproperty(msiobj* si, PyObject *args) ...@@ -539,7 +539,7 @@ summary_getproperty(msiobj* si, PyObject *args)
FILETIME fval; FILETIME fval;
char sbuf[1000]; char sbuf[1000];
char *sval = sbuf; char *sval = sbuf;
DWORD ssize = sizeof(sval); DWORD ssize = sizeof(sbuf);
if (!PyArg_ParseTuple(args, "i:GetProperty", &field)) if (!PyArg_ParseTuple(args, "i:GetProperty", &field))
return NULL; return NULL;
...@@ -547,6 +547,7 @@ summary_getproperty(msiobj* si, PyObject *args) ...@@ -547,6 +547,7 @@ summary_getproperty(msiobj* si, PyObject *args)
status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival, status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival,
&fval, sval, &ssize); &fval, sval, &ssize);
if (status == ERROR_MORE_DATA) { if (status == ERROR_MORE_DATA) {
ssize++;
sval = malloc(ssize); sval = malloc(ssize);
if (sval == NULL) { if (sval == NULL) {
return PyErr_NoMemory(); return PyErr_NoMemory();
...@@ -556,19 +557,29 @@ summary_getproperty(msiobj* si, PyObject *args) ...@@ -556,19 +557,29 @@ summary_getproperty(msiobj* si, PyObject *args)
} }
switch(type) { switch(type) {
case VT_I2: case VT_I4: case VT_I2:
return PyInt_FromLong(ival); case VT_I4:
result = PyLong_FromLong(ival);
break;
case VT_FILETIME: case VT_FILETIME:
PyErr_SetString(PyExc_NotImplementedError, "FILETIME result"); PyErr_SetString(PyExc_NotImplementedError, "FILETIME result");
return NULL; result = NULL;
break;
case VT_LPSTR: case VT_LPSTR:
result = PyString_FromStringAndSize(sval, ssize); result = PyBytes_FromStringAndSize(sval, ssize);
if (sval != sbuf) break;
free(sval); case VT_EMPTY:
return result; Py_INCREF(Py_None);
result = Py_None;
break;
default:
PyErr_Format(PyExc_NotImplementedError, "result of type %d", type);
result = NULL;
break;
} }
PyErr_Format(PyExc_NotImplementedError, "result of type %d", type); if (sval != sbuf)
return NULL; free(sval);
return result;
} }
static PyObject* static PyObject*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment