Skip to content

Commit bb6cdc7

Browse files
committed
Settings (Linux): fix memleaks reported by LeakSanitizer
1 parent 4a2d20f commit bb6cdc7

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Bugfixes:
99
* Don't print white color blocks with `--pipe` (#450)
1010
* Fix iTerm being detected as iTermServer-* sometimes
1111
* Fix sound device volume being incorrectly detected as muted sometimes (Sound)
12+
* Fix memleaks reported by LeakSanitizer (Linux)
1213

1314
Logo:
1415
* Update Windows 11 ASCII logo to look more visually consistent (#445)

src/common/settings.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,31 @@ typedef enum FFInitState
5757

5858
typedef struct GVariantGetters
5959
{
60-
FF_LIBRARY_SYMBOL(g_variant_get_string)
60+
FF_LIBRARY_SYMBOL(g_variant_dup_string)
6161
FF_LIBRARY_SYMBOL(g_variant_get_boolean)
6262
FF_LIBRARY_SYMBOL(g_variant_get_int32)
63+
FF_LIBRARY_SYMBOL(g_variant_unref)
6364
} GVariantGetters;
6465

6566
static FFvariant getGVariantValue(GVariant* variant, FFvarianttype type, const GVariantGetters* variantGetters)
6667
{
68+
FFvariant result;
69+
6770
if(variant == NULL)
68-
return FF_VARIANT_NULL;
71+
result = FF_VARIANT_NULL;
6972
else if(type == FF_VARIANT_TYPE_STRING)
70-
return (FFvariant) {.strValue = variantGetters->ffg_variant_get_string(variant, NULL)};
73+
result = (FFvariant) {.strValue = variantGetters->ffg_variant_dup_string(variant, NULL)}; // Dup string, so that variant itself can be freed
7174
else if(type == FF_VARIANT_TYPE_BOOL)
72-
return (FFvariant) {.boolValue = (bool) variantGetters->ffg_variant_get_boolean(variant), .boolValueSet = true};
75+
result = (FFvariant) {.boolValue = (bool) variantGetters->ffg_variant_get_boolean(variant), .boolValueSet = true};
7376
else if(type == FF_VARIANT_TYPE_INT)
74-
return (FFvariant) {.intValue = variantGetters->ffg_variant_get_int32(variant)};
77+
result = (FFvariant) {.intValue = variantGetters->ffg_variant_get_int32(variant)};
7578
else
76-
return FF_VARIANT_NULL;
79+
result = FF_VARIANT_NULL;
80+
81+
if(variant)
82+
variantGetters->ffg_variant_unref(variant);
83+
84+
return result;
7785
}
7886

7987
typedef struct GSettingsData
@@ -102,9 +110,10 @@ static const GSettingsData* getGSettingsData(const FFinstance* instance)
102110
FF_LIBRARY_DATA_LOAD_SYMBOL(g_settings_schema_source_get_default)
103111

104112
#define data data.variantGetters
105-
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_string)
113+
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_dup_string)
106114
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_boolean)
107115
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_int32)
116+
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_unref);
108117
#undef data
109118

110119
data.schemaSource = data.ffg_settings_schema_source_get_default();
@@ -169,7 +178,7 @@ static const DConfData* getDConfData(const FFinstance* instance)
169178
FF_LIBRARY_DATA_LOAD_SYMBOL(dconf_client_new)
170179

171180
#define data data.variantGetters
172-
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_string)
181+
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_dup_string)
173182
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_boolean)
174183
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_int32)
175184
#undef data

0 commit comments

Comments
 (0)