From f6635a115059da0e9cbd52ec5e633707634f523a Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 30 May 2022 09:03:51 +0300 Subject: [PATCH] kdecore: plug KLocale memory leak Signed-off-by: Ivailo Monev --- kdecore/localization/kcatalog.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/kdecore/localization/kcatalog.cpp b/kdecore/localization/kcatalog.cpp index b670d37a..0f323a3c 100644 --- a/kdecore/localization/kcatalog.cpp +++ b/kdecore/localization/kcatalog.cpp @@ -34,9 +34,8 @@ # include #endif -static char *langenv = 0; -static const int langenvMaxlen = 42; // = "LANGUAGE=" + 32 chars for language code + terminating zero +static const int langenvMaxlen = 42; Q_GLOBAL_STATIC(QMutex, catalogLock) @@ -91,15 +90,6 @@ KCatalog::KCatalog(const QString & name, const QString & language ) // Invalidate current language, to trigger binding at next translate call. KCatalogPrivate::currentLanguage.clear(); - - if (!langenv) { - // Call putenv only here, to initialize LANGUAGE variable. - // Later only change langenv to what is currently needed. - langenv = new char[langenvMaxlen]; - QByteArray lang = qgetenv("LANGUAGE"); - snprintf(langenv, langenvMaxlen, "LANGUAGE=%s", lang.constData()); - putenv(langenv); - } #endif } @@ -150,9 +140,11 @@ void KCatalogPrivate::setupGettextEnv () // Point Gettext to current language, recording system value for recovery. systemLanguage = qgetenv("LANGUAGE"); if (systemLanguage != language) { - // putenv has been called in the constructor, // it is enough to change the string set there. + char langenv[langenvMaxlen]; + ::memset(langenv, 0, langenvMaxlen * sizeof(char)); snprintf(langenv, langenvMaxlen, "LANGUAGE=%s", language.constData()); + putenv(strdup(langenv)); } // Rebind text domain if language actually changed from the last time, @@ -179,7 +171,10 @@ void KCatalogPrivate::setupGettextEnv () void KCatalogPrivate::resetSystemLanguage () { if (language != systemLanguage) { + char langenv[langenvMaxlen]; + ::memset(langenv, 0, langenvMaxlen * sizeof(char)); snprintf(langenv, langenvMaxlen, "LANGUAGE=%s", systemLanguage.constData()); + putenv(strdup(langenv)); } } #endif