Skip to content

Commit ab1e4d2

Browse files
committed
GLUI: LinuxFileDialog: handle invalid utf8 filenames properly during sort
Signed-off-by: Stefan Westerfeld <[email protected]>
1 parent fcf9eb6 commit ab1e4d2

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

glui/smlinuxfiledialog.cc

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -357,15 +357,20 @@ class FileDialogWindow : public Window
357357
if (d1 != d2)
358358
return d1 > d2; // directories first
359359

360-
char *filename1_nocase = g_utf8_casefold (i1.filename.c_str(), -1);
361-
char *filename2_nocase = g_utf8_casefold (i2.filename.c_str(), -1);
362-
char *key1 = g_utf8_collate_key_for_filename (filename1_nocase, -1);
363-
char *key2 = g_utf8_collate_key_for_filename (filename2_nocase, -1);
364-
string ks1 = key1, ks2 = key2;
365-
g_free (key1);
366-
g_free (key2);
367-
g_free (filename1_nocase);
368-
g_free (filename2_nocase);
360+
auto sort_key = [] (const string& filename)
361+
{
362+
char *utf8_valid_name = g_utf8_make_valid (filename.c_str(), -1);
363+
char *name_nocase = g_utf8_casefold (utf8_valid_name, -1);
364+
char *key = g_utf8_collate_key_for_filename (name_nocase, -1);
365+
string ks = key;
366+
g_free (key);
367+
g_free (name_nocase);
368+
g_free (utf8_valid_name);
369+
370+
return ks;
371+
};
372+
string ks1 = sort_key (i1.filename);
373+
string ks2 = sort_key (i2.filename);
369374
return ks1 < ks2;
370375
});
371376
for (auto item : items)

0 commit comments

Comments
 (0)