diff options
author | Tor Lillqvist <tlillqvist@novell.com> | 2011-02-01 14:26:46 +0200 |
---|---|---|
committer | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2011-02-01 13:53:44 +0100 |
commit | d837e29c506b305855d135baeaf5844ea901ad08 (patch) | |
tree | c4afd8287d201e78f95a95b45a89536a4f312edb | |
parent | e5b80ed0b1b0b4ef1e34a42cf09e17f555ade975 (diff) |
Fix overflow problem in the custom action for UI language de-selection
In the _all_ installer we have slightly over 100 LibreOffice UI
languages. The code in the custom action that de-selects UI languages
based on the Windows UI language(s) and the user's locale had a limit
of 100.
The consequence was that a few of the alphabetically last LibreOffice
UI languages: Ukrainan, Urdu, Uzbek, Venda and Xhosa, were not
de-selected even if none of those languages was used by the user or
Windows, and thus got installed in a "quick" install and also in a
"custom" install unless the person running the installer noticed.
Reported by aseques_ on IRC, no bug filed yet.
Signed-off-by: Fridrich Štrba <fridrich.strba@bluewin.ch>
-rw-r--r-- | setup_native/source/win32/customactions/sellang/sellang.cxx | 217 |
1 files changed, 104 insertions, 113 deletions
diff --git a/setup_native/source/win32/customactions/sellang/sellang.cxx b/setup_native/source/win32/customactions/sellang/sellang.cxx index a031606d1823..5d3678744514 100644 --- a/setup_native/source/win32/customactions/sellang/sellang.cxx +++ b/setup_native/source/win32/customactions/sellang/sellang.cxx @@ -28,28 +28,23 @@ * ************************************************************************/ +/* Currently the "all" installer has a bit over 100 UI languages, and + * I doubt it will grow a lot over that. + */ +#define MAX_LANGUAGES 200 + #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0500 #undef WINVER #define WINVER 0x0500 -#pragma warning(push, 1) /* disable warnings within system headers as - * warnings are now treated as errors... - */ #include <windows.h> #include <msiquery.h> #include <malloc.h> -#ifdef UNICODE -#define _UNICODE -#define _tstring wstring -#else -#define _tstring string -#endif -#include <tchar.h> -#include <string> #include <stdio.h> -#pragma warning(pop) +#include <stdlib.h> +#include <string.h> #include <sal/macros.h> #include <systools/win32/uwinapi.h> @@ -59,10 +54,10 @@ static const char * langid_to_string( LANGID langid, int *have_default_lang ) { - /* Map from LANGID to string. The languages below are in the same - * seemingly random order as in - * setup_native/source/win32/msi-encodinglist.txt. - * Only the language part is returned in the string. + /* Map from LANGID to string. The languages below are now in + * alphabetical order of codes as in + * setup_native/source/win32/msi-encodinglist.txt. Only the + * language part is returned in the string. */ switch (PRIMARYLANGID (langid)) { case LANG_ENGLISH: @@ -70,112 +65,110 @@ langid_to_string( LANGID langid, int *have_default_lang ) langid == MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)) *have_default_lang = 1; return "en"; -#define CASE(primary, name) \ +#define CASE(name, primary) \ case LANG_##primary: return #name - CASE(PORTUGUESE, pt); - CASE(RUSSIAN, ru); - CASE(GREEK, el); - CASE(DUTCH, nl); - CASE(FRENCH, fr); - CASE(SPANISH, es); - CASE(FINNISH, fi); - CASE(HUNGARIAN, hu); - CASE(CATALAN, ca); - CASE(ITALIAN, it); - CASE(CZECH, cs); - CASE(SLOVAK, sk); - CASE(DANISH, da); - CASE(SWEDISH, sv); - CASE(POLISH, pl); - CASE(GERMAN, de); - CASE(THAI, th); - CASE(ESTONIAN, et); - CASE(JAPANESE, ja); - CASE(KOREAN, ko); - // CASE(KHMER, km); - // CASE(WELSH, cy); - CASE(CHINESE, zh); - CASE(TURKISH, tr); - CASE(HINDI, hi); - CASE(PUNJABI, pa); - CASE(TAMIL, ta); - CASE(ARABIC, ar); - CASE(HEBREW, he); - CASE(AFRIKAANS, af); - CASE(ALBANIAN, sq); - CASE(ARMENIAN, hy); - CASE(BASQUE, eu); - CASE(BELARUSIAN, be); - CASE(BENGALI, bn); - CASE(BULGARIAN, bg); - CASE(ICELANDIC, is); - CASE(INDONESIAN, id); - // CASE(LAO, lo); - CASE(LATVIAN, lv); - CASE(LITHUANIAN, lt); - // CASE(MALTESE, mt); - // CASE(ROMANSH, rm); - CASE(ROMANIAN, ro); - // CASE(KINYARWANDA, rw); - CASE(SANSKRIT, sa); - // CASE(SETSWANA, tn); - CASE(FARSI, fa); - CASE(FAEROESE, fo); - CASE(SLOVENIAN, sl); - // CASE(SORBIAN, sb); - // CASE(SUTU, st); - CASE(SWAHILI, sw); - CASE(TATAR, tt); - // CASE(TSONGA, ts); - CASE(UKRAINIAN, uk); - CASE(URDU, ur); - CASE(VIETNAMESE, vi); - // CASE(XHOSA, xh); - // CASE(YIDDISH, yi); - // CASE(ZULU, zu); - CASE(GUJARATI, gu); - // CASE(BRETON, br); - CASE(NEPALI, ne); - // CASE(NDEBELE, nr); - // CASE(SWAZI, ss); - // CASE(VENDA, ve); - // CASE(IRISH, ga); - CASE(MACEDONIAN, mk); - CASE(TELUGU, te); - CASE(MALAYALAM, ml); - CASE(MARATHI, mr); - CASE(ORIYA, or); - // CASE(KURDISH, ku); - // CASE(TAGALOG, tg); - // CASE(TIGRINYA, ti); - CASE(GALICIAN, gl); - CASE(KANNADA, kn); - CASE(MALAY, ms); - // CASE(TAJIK, tg); - CASE(GEORGIAN, ka); - // CASE(ESPERANTO, eo); + CASE(af, AFRIKAANS); + CASE(ar, ARABIC); + CASE(as, ASSAMESE); + CASE(be, BELARUSIAN); + CASE(bg, BULGARIAN); + CASE(bn, BENGALI); + CASE(br, BRETON); + CASE(ca, CATALAN); + CASE(cs, CZECH); + CASE(cy, WELSH); + CASE(da, DANISH); + CASE(de, GERMAN); + CASE(el, GREEK); + CASE(es, SPANISH); + CASE(et, ESTONIAN); + CASE(eu, BASQUE); + CASE(fa, FARSI); + CASE(fi, FINNISH); + CASE(fo, FAEROESE); + CASE(fr, FRENCH); + CASE(ga, IRISH); + CASE(gl, GALICIAN); + CASE(gu, GUJARATI); + CASE(he, HEBREW); + CASE(hi, HINDI); + CASE(hu, HUNGARIAN); + CASE(hy, ARMENIAN); + CASE(id, INDONESIAN); + CASE(is, ICELANDIC); + CASE(it, ITALIAN); + CASE(ja, JAPANESE); + CASE(ka, GEORGIAN); + CASE(km, KHMER); + CASE(kn, KANNADA); + CASE(ko, KOREAN); + CASE(ks, KASHMIRI); + CASE(lo, LAO); + CASE(lt, LITHUANIAN); + CASE(lv, LATVIAN); + CASE(mk, MACEDONIAN); + CASE(ml, MALAYALAM); + CASE(mn, MONGOLIAN); + CASE(mr, MARATHI); + CASE(ms, MALAY); + CASE(mt, MALTESE); + CASE(ne, NEPALI); + CASE(nl, DUTCH); + CASE(ns, SOTHO); + CASE(or, ORIYA); + CASE(pa, PUNJABI); + CASE(pl, POLISH); + CASE(pt, PORTUGUESE); + CASE(rm, ROMANSH); + CASE(ro, ROMANIAN); + CASE(ru, RUSSIAN); + CASE(rw, KINYARWANDA); + CASE(sa, SANSKRIT); + CASE(sb, UPPER_SORBIAN); + CASE(sd, SINDHI); + CASE(sk, SLOVAK); + CASE(sl, SLOVENIAN); + CASE(sq, ALBANIAN); + CASE(sv, SWEDISH); + CASE(sw, SWAHILI); + CASE(ta, TAMIL); + CASE(te, TELUGU); + CASE(tg, TAJIK); + CASE(th, THAI); + CASE(ti, TIGRIGNA); + CASE(tn, TSWANA); + CASE(tr, TURKISH); + CASE(tt, TATAR); + CASE(uk, UKRAINIAN); + CASE(ur, URDU); + CASE(uz, UZBEK); + CASE(vi, VIETNAMESE); + CASE(xh, XHOSA); + CASE(zh, CHINESE); + CASE(zu, ZULU); #undef CASE /* Special cases */ default: switch (langid) { case MAKELANGID(LANG_SERBIAN, 0x05): return "bs"; -#define CASE(primary, sub, name) \ +#define CASE(name, primary, sub) \ case MAKELANGID(LANG_##primary, SUBLANG_##sub): return #name - CASE(NORWEGIAN, NORWEGIAN_BOKMAL, nb); - CASE(NORWEGIAN, NORWEGIAN_NYNORSK, nn); - CASE(SERBIAN, DEFAULT, hr); - CASE(SERBIAN, SERBIAN_LATIN, sh); - CASE(SERBIAN, SERBIAN_CYRILLIC, sr); - // CASE(SOTHO, DEFAULT, ns); - // CASE(SOTHO, SOTHO_SOUTHERN, st); + CASE(hr, SERBIAN, DEFAULT); + CASE(nb, NORWEGIAN, NORWEGIAN_BOKMAL); + CASE(nn, NORWEGIAN, NORWEGIAN_NYNORSK); + CASE(sh, SERBIAN, SERBIAN_LATIN); + CASE(sr, SERBIAN, SERBIAN_CYRILLIC); #undef CASE default: return ""; } } } -static const char *ui_langs[100]; +/* Here we collect the UI languages present on the system; + * MAX_LANGUAGES is certainly enough for that + */ +static const char *ui_langs[MAX_LANGUAGES]; static int num_ui_langs = 0; BOOL CALLBACK @@ -209,10 +202,7 @@ extern "C" UINT __stdcall SelectLanguage( MSIHANDLE handle ) MSIHANDLE database, view, record; DWORD length; int nlangs = 0; - /* Keeping this code simple and stupid... won't bother with any - * dynamic arrays or whatnot. 100 is more than enough for this purpose. - */ - char langs[100][6]; + char langs[MAX_LANGUAGES][6]; database = MsiGetActiveDatabase(handle); @@ -235,7 +225,8 @@ extern "C" UINT __stdcall SelectLanguage( MSIHANDLE handle ) MessageBoxA(NULL, "MsiViewExecute success!", "SelectLanguage", MB_OK); #endif - while (MsiViewFetch(view, &record) == ERROR_SUCCESS) { + while (nlangs < MAX_LANGUAGES && + MsiViewFetch(view, &record) == ERROR_SUCCESS) { length = sizeof(feature); if (MsiRecordGetStringA(record, 1, feature, &length) != ERROR_SUCCESS) { MsiCloseHandle(record); |