@@ -625,7 +625,7 @@ load_kernel_module_list (void)
625
625
g_autofree char * modules_data = NULL ;
626
626
g_autoptr (GError ) error = NULL ;
627
627
char * start , * end ;
628
-
628
+
629
629
if (!g_file_get_contents ("/proc/modules" , & modules_data , NULL , & error ))
630
630
{
631
631
g_debug ("Failed to read /proc/modules: %s" , error -> message );
@@ -9221,6 +9221,125 @@ flatpak_uri_equal (const char *uri1,
9221
9221
return g_strcmp0 (uri1_norm , uri2_norm ) == 0 ;
9222
9222
}
9223
9223
9224
+ static gboolean
9225
+ is_char_safe (gunichar c )
9226
+ {
9227
+ return g_unichar_isgraph (c ) || c == ' ' ;
9228
+ }
9229
+
9230
+ static gboolean
9231
+ should_hex_escape (gunichar c ,
9232
+ FlatpakEscapeFlags flags )
9233
+ {
9234
+ if ((flags & FLATPAK_ESCAPE_ALLOW_NEWLINES ) && c == '\n' )
9235
+ return FALSE;
9236
+
9237
+ return !is_char_safe (c );
9238
+ }
9239
+
9240
+ static void
9241
+ append_hex_escaped_character (GString * result ,
9242
+ gunichar c )
9243
+ {
9244
+ if (c <= 0xFF )
9245
+ g_string_append_printf (result , "\\x%02X" , c );
9246
+ else if (c <= 0xFFFF )
9247
+ g_string_append_printf (result , "\\u%04X" , c );
9248
+ else
9249
+ g_string_append_printf (result , "\\U%08X" , c );
9250
+ }
9251
+
9252
+ static char *
9253
+ escape_character (gunichar c )
9254
+ {
9255
+ g_autoptr (GString ) res = g_string_new ("" );
9256
+ append_hex_escaped_character (res , c );
9257
+ return g_string_free (g_steal_pointer (& res ), FALSE);
9258
+ }
9259
+
9260
+ char *
9261
+ flatpak_escape_string (const char * s ,
9262
+ FlatpakEscapeFlags flags )
9263
+ {
9264
+ g_autoptr (GString ) res = g_string_new ("" );
9265
+ gboolean did_escape = FALSE;
9266
+
9267
+ while (* s )
9268
+ {
9269
+ gunichar c = g_utf8_get_char_validated (s , -1 );
9270
+ if (c == (gunichar )- 2 || c == (gunichar )- 1 )
9271
+ {
9272
+ /* Need to convert to unsigned first, to avoid negative chars becoming
9273
+ huge gunichars. */
9274
+ append_hex_escaped_character (res , (unsigned char )* s ++ );
9275
+ did_escape = TRUE;
9276
+ continue ;
9277
+ }
9278
+ else if (should_hex_escape (c , flags ))
9279
+ {
9280
+ append_hex_escaped_character (res , c );
9281
+ did_escape = TRUE;
9282
+ }
9283
+ else if (c == '\\' || (!(flags & FLATPAK_ESCAPE_DO_NOT_QUOTE ) && c == '\'' ))
9284
+ {
9285
+ g_string_append_printf (res , "\\%c" , (char ) c );
9286
+ did_escape = TRUE;
9287
+ }
9288
+ else
9289
+ g_string_append_unichar (res , c );
9290
+
9291
+ s = g_utf8_find_next_char (s , NULL );
9292
+ }
9293
+
9294
+ if (did_escape && !(flags & FLATPAK_ESCAPE_DO_NOT_QUOTE ))
9295
+ {
9296
+ g_string_prepend_c (res , '\'' );
9297
+ g_string_append_c (res , '\'' );
9298
+ }
9299
+
9300
+ return g_string_free (g_steal_pointer (& res ), FALSE);
9301
+ }
9302
+
9303
+ void
9304
+ flatpak_print_escaped_string (const char * s ,
9305
+ FlatpakEscapeFlags flags )
9306
+ {
9307
+ g_autofree char * escaped = flatpak_escape_string (s , flags );
9308
+ g_print ("%s" , escaped );
9309
+ }
9310
+
9311
+ gboolean
9312
+ flatpak_validate_path_characters (const char * path ,
9313
+ GError * * error )
9314
+ {
9315
+ while (* path )
9316
+ {
9317
+ gunichar c = g_utf8_get_char_validated (path , -1 );
9318
+ if (c == (gunichar )- 1 || c == (gunichar )- 2 )
9319
+ {
9320
+ /* Need to convert to unsigned first, to avoid negative chars becoming
9321
+ huge gunichars. */
9322
+ g_autofree char * escaped_char = escape_character ((unsigned char )* path );
9323
+ g_autofree char * escaped = flatpak_escape_string (path , FLATPAK_ESCAPE_DEFAULT );
9324
+ g_set_error (error , G_IO_ERROR , G_IO_ERROR_INVALID_DATA ,
9325
+ "Non-UTF8 byte %s in path %s" , escaped_char , escaped );
9326
+ return FALSE;
9327
+ }
9328
+ else if (!is_char_safe (c ))
9329
+ {
9330
+ g_autofree char * escaped_char = escape_character (c );
9331
+ g_autofree char * escaped = flatpak_escape_string (path , FLATPAK_ESCAPE_DEFAULT );
9332
+ g_set_error (error , G_IO_ERROR , G_IO_ERROR_INVALID_DATA ,
9333
+ "Non-graphical character %s in path %s" , escaped_char , escaped );
9334
+ return FALSE;
9335
+ }
9336
+
9337
+ path = g_utf8_find_next_char (path , NULL );
9338
+ }
9339
+
9340
+ return TRUE;
9341
+ }
9342
+
9224
9343
gboolean
9225
9344
running_under_sudo (void )
9226
9345
{
0 commit comments