@@ -2435,10 +2435,65 @@ flatpak_context_make_sandboxed (FlatpakContext *context)
2435
2435
}
2436
2436
2437
2437
const char * dont_mount_in_root [] = {
2438
- "." , ".." , "lib" , "lib32" , "lib64" , "bin" , "sbin" , "usr" , "boot" , "efi" ,
2439
- "root" , "tmp" , "etc" , "app" , "run" , "proc" , "sys" , "dev" , "var" , NULL
2438
+ "." ,
2439
+ ".." ,
2440
+ "app" ,
2441
+ "bin" ,
2442
+ "boot" ,
2443
+ "dev" ,
2444
+ "efi" ,
2445
+ "etc" ,
2446
+ "lib" ,
2447
+ "lib32" ,
2448
+ "lib64" ,
2449
+ "proc" ,
2450
+ "root" ,
2451
+ "run" ,
2452
+ "sbin" ,
2453
+ "sys" ,
2454
+ "tmp" ,
2455
+ "usr" ,
2456
+ "var" ,
2457
+ NULL
2440
2458
};
2441
2459
2460
+ static void
2461
+ log_cannot_export_error (FlatpakFilesystemMode mode ,
2462
+ const char * path ,
2463
+ const GError * error )
2464
+ {
2465
+ GLogLevelFlags level = G_LOG_LEVEL_MESSAGE ;
2466
+
2467
+ /* By default we don't show a log message if the reason we are not sharing
2468
+ * something with the sandbox is simply "it doesn't exist" (or something
2469
+ * very close): otherwise it would be very noisy to launch apps that
2470
+ * opportunistically share things they might benefit from, like Steam
2471
+ * having access to $XDG_RUNTIME_DIR/app/com.discordapp.Discord if it
2472
+ * happens to exist. */
2473
+ if (g_error_matches (error , G_IO_ERROR , G_IO_ERROR_NOT_FOUND ))
2474
+ level = G_LOG_LEVEL_INFO ;
2475
+ /* Some callers specifically suppress warnings for particular errors
2476
+ * by setting this code. */
2477
+ else if (g_error_matches (error , G_IO_ERROR , G_IO_ERROR_FAILED_HANDLED ))
2478
+ level = G_LOG_LEVEL_INFO ;
2479
+
2480
+ switch (mode )
2481
+ {
2482
+ case FLATPAK_FILESYSTEM_MODE_NONE :
2483
+ g_log (G_LOG_DOMAIN , level , _ ("Not replacing \"%s\" with tmpfs: %s" ),
2484
+ path , error -> message );
2485
+ break ;
2486
+
2487
+ case FLATPAK_FILESYSTEM_MODE_CREATE :
2488
+ case FLATPAK_FILESYSTEM_MODE_READ_ONLY :
2489
+ case FLATPAK_FILESYSTEM_MODE_READ_WRITE :
2490
+ g_log (G_LOG_DOMAIN , level ,
2491
+ _ ("Not sharing \"%s\" with sandbox: %s" ),
2492
+ path , error -> message );
2493
+ break ;
2494
+ }
2495
+ }
2496
+
2442
2497
static void
2443
2498
flatpak_context_export (FlatpakContext * context ,
2444
2499
FlatpakExports * exports ,
@@ -2453,6 +2508,7 @@ flatpak_context_export (FlatpakContext *context,
2453
2508
FlatpakFilesystemMode fs_mode , os_mode , etc_mode , home_mode ;
2454
2509
GHashTableIter iter ;
2455
2510
gpointer key , value ;
2511
+ g_autoptr (GError ) local_error = NULL ;
2456
2512
2457
2513
if (xdg_dirs_conf_out != NULL )
2458
2514
xdg_dirs_conf = g_string_new ("" );
@@ -2478,11 +2534,30 @@ flatpak_context_export (FlatpakContext *context,
2478
2534
continue ;
2479
2535
2480
2536
path = g_build_filename ("/" , dirent -> d_name , NULL );
2481
- flatpak_exports_add_path_expose (exports , fs_mode , path );
2537
+
2538
+ if (!flatpak_exports_add_path_expose (exports , fs_mode , path , & local_error ))
2539
+ {
2540
+ /* Failure to share something like /lib32 because it's
2541
+ * actually a symlink to /usr/lib32 is less of a problem
2542
+ * here than it would be for an explicit
2543
+ * --filesystem=/lib32, so the warning that would normally
2544
+ * be produced in that situation is downgraded to a
2545
+ * debug message. */
2546
+ if (g_error_matches (local_error , G_IO_ERROR , G_IO_ERROR_NOT_MOUNTABLE_FILE ))
2547
+ local_error -> code = G_IO_ERROR_FAILED_HANDLED ;
2548
+
2549
+ log_cannot_export_error (fs_mode , path , local_error );
2550
+ g_clear_error (& local_error );
2551
+ }
2482
2552
}
2483
2553
closedir (dir );
2484
2554
}
2485
- flatpak_exports_add_path_expose (exports , fs_mode , "/run/media" );
2555
+
2556
+ if (!flatpak_exports_add_path_expose (exports , fs_mode , "/run/media" , & local_error ))
2557
+ {
2558
+ log_cannot_export_error (fs_mode , "/run/media" , local_error );
2559
+ g_clear_error (& local_error );
2560
+ }
2486
2561
}
2487
2562
2488
2563
os_mode = MAX (GPOINTER_TO_INT (g_hash_table_lookup (context -> filesystems , "host-os" )),
@@ -2503,7 +2578,16 @@ flatpak_context_export (FlatpakContext *context,
2503
2578
g_debug ("Allowing homedir access" );
2504
2579
home_access = TRUE;
2505
2580
2506
- flatpak_exports_add_path_expose (exports , MAX (home_mode , fs_mode ), g_get_home_dir ());
2581
+ if (!flatpak_exports_add_path_expose (exports , MAX (home_mode , fs_mode ), g_get_home_dir (), & local_error ))
2582
+ {
2583
+ /* Even if the error is one that we would normally silence, like
2584
+ * the path not existing, it seems reasonable to make more of a fuss
2585
+ * about the home directory not existing or otherwise being unusable,
2586
+ * so this is intentionally not using cannot_export() */
2587
+ g_warning (_ ("Not allowing home directory access: %s" ),
2588
+ local_error -> message );
2589
+ g_clear_error (& local_error );
2590
+ }
2507
2591
}
2508
2592
2509
2593
g_hash_table_iter_init (& iter , context -> filesystems );
@@ -2553,7 +2637,11 @@ flatpak_context_export (FlatpakContext *context,
2553
2637
g_string_append_printf (xdg_dirs_conf , "%s=\"%s\"\n" ,
2554
2638
config_key , path );
2555
2639
2556
- flatpak_exports_add_path_expose_or_hide (exports , mode , subpath );
2640
+ if (!flatpak_exports_add_path_expose_or_hide (exports , mode , subpath , & local_error ))
2641
+ {
2642
+ log_cannot_export_error (mode , subpath , local_error );
2643
+ g_clear_error (& local_error );
2644
+ }
2557
2645
}
2558
2646
}
2559
2647
else if (g_str_has_prefix (filesystem , "~/" ))
@@ -2568,8 +2656,11 @@ flatpak_context_export (FlatpakContext *context,
2568
2656
g_debug ("Unable to create directory %s" , path );
2569
2657
}
2570
2658
2571
- if (g_file_test (path , G_FILE_TEST_EXISTS ))
2572
- flatpak_exports_add_path_expose_or_hide (exports , mode , path );
2659
+ if (!flatpak_exports_add_path_expose_or_hide (exports , mode , path , & local_error ))
2660
+ {
2661
+ log_cannot_export_error (mode , path , local_error );
2662
+ g_clear_error (& local_error );
2663
+ }
2573
2664
}
2574
2665
else if (g_str_has_prefix (filesystem , "/" ))
2575
2666
{
@@ -2579,8 +2670,11 @@ flatpak_context_export (FlatpakContext *context,
2579
2670
g_debug ("Unable to create directory %s" , filesystem );
2580
2671
}
2581
2672
2582
- if (g_file_test (filesystem , G_FILE_TEST_EXISTS ))
2583
- flatpak_exports_add_path_expose_or_hide (exports , mode , filesystem );
2673
+ if (!flatpak_exports_add_path_expose_or_hide (exports , mode , filesystem , & local_error ))
2674
+ {
2675
+ log_cannot_export_error (mode , filesystem , local_error );
2676
+ g_clear_error (& local_error );
2677
+ }
2584
2678
}
2585
2679
else
2586
2680
{
@@ -2593,18 +2687,42 @@ flatpak_context_export (FlatpakContext *context,
2593
2687
g_autoptr (GFile ) apps_dir = g_file_get_parent (app_id_dir );
2594
2688
int i ;
2595
2689
/* Hide the .var/app dir by default (unless explicitly made visible) */
2596
- flatpak_exports_add_path_tmpfs (exports , flatpak_file_get_path_cached (apps_dir ));
2690
+ if (!flatpak_exports_add_path_tmpfs (exports ,
2691
+ flatpak_file_get_path_cached (apps_dir ),
2692
+ & local_error ))
2693
+ {
2694
+ log_cannot_export_error (FLATPAK_FILESYSTEM_MODE_NONE ,
2695
+ flatpak_file_get_path_cached (apps_dir ),
2696
+ local_error );
2697
+ g_clear_error (& local_error );
2698
+ }
2699
+
2597
2700
/* But let the app write to the per-app dir in it */
2598
- flatpak_exports_add_path_expose (exports , FLATPAK_FILESYSTEM_MODE_READ_WRITE ,
2599
- flatpak_file_get_path_cached (app_id_dir ));
2701
+ if (!flatpak_exports_add_path_expose (exports , FLATPAK_FILESYSTEM_MODE_READ_WRITE ,
2702
+ flatpak_file_get_path_cached (app_id_dir ),
2703
+ & local_error ))
2704
+ {
2705
+ log_cannot_export_error (FLATPAK_FILESYSTEM_MODE_READ_WRITE ,
2706
+ flatpak_file_get_path_cached (apps_dir ),
2707
+ local_error );
2708
+ g_clear_error (& local_error );
2709
+ }
2600
2710
2601
2711
if (extra_app_id_dirs != NULL )
2602
2712
{
2603
2713
for (i = 0 ; i < extra_app_id_dirs -> len ; i ++ )
2604
2714
{
2605
2715
GFile * extra_app_id_dir = g_ptr_array_index (extra_app_id_dirs , i );
2606
- flatpak_exports_add_path_expose (exports , FLATPAK_FILESYSTEM_MODE_READ_WRITE ,
2607
- flatpak_file_get_path_cached (extra_app_id_dir ));
2716
+ if (!flatpak_exports_add_path_expose (exports ,
2717
+ FLATPAK_FILESYSTEM_MODE_READ_WRITE ,
2718
+ flatpak_file_get_path_cached (extra_app_id_dir ),
2719
+ & local_error ))
2720
+ {
2721
+ log_cannot_export_error (FLATPAK_FILESYSTEM_MODE_READ_WRITE ,
2722
+ flatpak_file_get_path_cached (extra_app_id_dir ),
2723
+ local_error );
2724
+ g_clear_error (& local_error );
2725
+ }
2608
2726
}
2609
2727
}
2610
2728
}
@@ -2668,13 +2786,27 @@ flatpak_context_get_exports_full (FlatpakContext *context,
2668
2786
if (include_default_dirs )
2669
2787
{
2670
2788
g_autoptr (GFile ) user_flatpak_dir = NULL ;
2789
+ g_autoptr (GError ) local_error = NULL ;
2671
2790
2672
2791
/* Hide the flatpak dir by default (unless explicitly made visible) */
2673
2792
user_flatpak_dir = flatpak_get_user_base_dir_location ();
2674
- flatpak_exports_add_path_tmpfs (exports , flatpak_file_get_path_cached (user_flatpak_dir ));
2793
+ if (!flatpak_exports_add_path_tmpfs (exports ,
2794
+ flatpak_file_get_path_cached (user_flatpak_dir ),
2795
+ & local_error ))
2796
+ {
2797
+ log_cannot_export_error (FLATPAK_FILESYSTEM_MODE_NONE ,
2798
+ flatpak_file_get_path_cached (user_flatpak_dir ),
2799
+ local_error );
2800
+ g_clear_error (& local_error );
2801
+ }
2675
2802
2676
2803
/* Ensure we always have a homedir */
2677
- flatpak_exports_add_path_dir (exports , g_get_home_dir ());
2804
+ if (!flatpak_exports_add_path_dir (exports , g_get_home_dir (), & local_error ))
2805
+ {
2806
+ g_warning (_ ("Unable to provide a temporary home directory in the sandbox: %s" ),
2807
+ local_error -> message );
2808
+ g_clear_error (& local_error );
2809
+ }
2678
2810
}
2679
2811
2680
2812
return g_steal_pointer (& exports );
0 commit comments