summaryrefslogtreecommitdiffstats
path: root/libmsi
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2013-11-08 14:13:39 +0100
committerMarc-André Lureau <marcandre.lureau@gmail.com>2013-11-08 14:16:34 +0100
commite02b155b332df452a9df86984e11eb8a1772aa86 (patch)
treedc63dfbc1e22694dd587c01f0993c0d74c3d631a /libmsi
parent39ce5d7df4302dcabccf6ea524d3f86fedc45856 (diff)
downloadmsitools-e02b155b332df452a9df86984e11eb8a1772aa86.tar.gz
msitools-e02b155b332df452a9df86984e11eb8a1772aa86.tar.xz
msitools-e02b155b332df452a9df86984e11eb8a1772aa86.zip
libmsi: don't crash on invalid string conversion
SSIA, TODO: check if "forcecodepage" is used correctly. https://bugzilla.redhat.com/show_bug.cgi?id=1027256
Diffstat (limited to 'libmsi')
-rw-r--r--libmsi/string.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libmsi/string.c b/libmsi/string.c
index 9514d46..0dfa003 100644
--- a/libmsi/string.c
+++ b/libmsi/string.c
@@ -200,6 +200,8 @@ static void insert_string_sorted( string_table *st, unsigned string_id )
static void set_st_entry( string_table *st, unsigned n, char *str, uint16_t refcount, enum StringPersistence persistence )
{
+ g_return_if_fail(str != NULL);
+
if (persistence == StringPersistent)
{
st->strings[n].persistent_refcount = refcount;
@@ -253,6 +255,7 @@ static int msi_addstring( string_table *st, unsigned n, const char *data, int le
size_t sz;
int codepage;
GIConv cpconv;
+ GError *err = NULL;
if( !data )
return 0;
@@ -288,10 +291,14 @@ static int msi_addstring( string_table *st, unsigned n, const char *data, int le
/* allocate a new string */
codepage = st->codepage ? st->codepage : gsf_msole_iconv_win_codepage();
cpconv = gsf_msole_iconv_open_for_import(codepage);
- str = g_convert_with_iconv(data, len, cpconv, NULL, &sz, NULL);
+ str = g_convert_with_iconv(data, len, cpconv, NULL, &sz, &err);
g_iconv_close(cpconv);
-
- set_st_entry( st, n, str, refcount, persistence );
+ if (err) {
+ g_warning("iconv failed: %s", err->message);
+ g_clear_error(&err);
+ } else {
+ set_st_entry( st, n, str, refcount, persistence);
+ }
return n;
}