Skip to content

Commit 7b62ce9

Browse files
committed
Gracefully handle invalid .desktop files
Handle null pointers in compare_app_name(). Do not create an entry unless a file contains a `[Desktop Entry]` section and a `Name=` field. Reported-by: @kode54 Fixes: #15
1 parent ec1ed31 commit 7b62ce9

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

desktop.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,22 @@ isprog(const char *prog)
219219
return true;
220220
}
221221

222+
static void
223+
destroy_app(struct app *app)
224+
{
225+
g_free(app->name);
226+
g_free(app->name_localized);
227+
g_free(app->generic_name);
228+
g_free(app->generic_name_localized);
229+
g_free(app->exec);
230+
g_free(app->tryexec);
231+
g_free(app->working_dir);
232+
g_free(app->icon);
233+
g_free(app->categories);
234+
g_free(app->filename);
235+
g_free(app);
236+
}
237+
222238
static struct app *
223239
add_app(FILE *fp, char *filename)
224240
{
@@ -254,6 +270,17 @@ add_app(FILE *fp, char *filename)
254270
}
255271
parse_line(line, app, &is_desktop_entry);
256272
}
273+
274+
/*
275+
* Bail out if the .desktop file does not contain a [Desktop Entry] or
276+
* Name= field.
277+
*/
278+
if (!app->name) {
279+
fprintf(stderr, "warn: file '%s' contains no valid desktop entry\n", filename);
280+
destroy_app(app);
281+
return NULL;
282+
}
283+
257284
app->filename = strdup(filename);
258285

259286
/* post-processing */
@@ -340,7 +367,7 @@ compare_app_name(const void *a, const void *b)
340367
bb_name = bb->name_localized ? bb->name_localized : bb->name;
341368
aa_name = g_utf8_casefold(aa_name, -1);
342369
bb_name = g_utf8_casefold(bb_name, -1);
343-
int ret = strcmp(aa_name, bb_name);
370+
int ret = g_strcmp0(aa_name, bb_name);
344371
g_free((void *)aa_name);
345372
g_free((void *)bb_name);
346373
return ret;
@@ -405,17 +432,7 @@ desktop_entries_destroy(GList *apps)
405432
GList *iter;
406433
for (iter = apps; iter; iter = iter->next) {
407434
struct app *app = (struct app *)iter->data;
408-
g_free(app->name);
409-
g_free(app->name_localized);
410-
g_free(app->generic_name);
411-
g_free(app->generic_name_localized);
412-
g_free(app->exec);
413-
g_free(app->tryexec);
414-
g_free(app->working_dir);
415-
g_free(app->icon);
416-
g_free(app->categories);
417-
g_free(app->filename);
418-
g_free(app);
435+
destroy_app(app);
419436
}
420437
g_list_free(apps);
421438
}

0 commit comments

Comments
 (0)