* Fri Mar 26 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.2-2
- Fix FAT mkfs with dosfstools >= 4.2 - udiskslinuxdriveata: Use GTask to apply configuration in a thread - Limit allowed module names - 80-udisks2.rules: Ignore Apple boot partition from livecd-tools
This commit is contained in:
		
							parent
							
								
									bec888cb71
								
							
						
					
					
						commit
						41209e5112
					
				
							
								
								
									
										25
									
								
								ignore-apple-boot-part.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								ignore-apple-boot-part.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| From b9863c11601e199420a375e13505e2b795de77c5 Mon Sep 17 00:00:00 2001 | ||||
| From: Frederick Grose <4335897+FGrose@users.noreply.github.com> | ||||
| Date: Tue, 9 Feb 2021 19:02:01 -0500 | ||||
| Subject: [PATCH] 80-udisks2.rules: Ignore Apple boot partition from | ||||
|  livecd-tools | ||||
| 
 | ||||
| https://github.com/livecd-tools/livecd-tools/pull/176 creates a new boot | ||||
| partition with livecd-iso-to-disk from Fedora Live .iso files that UDISKS | ||||
| should ignore. | ||||
| ---
 | ||||
|  data/80-udisks2.rules | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/data/80-udisks2.rules b/data/80-udisks2.rules
 | ||||
| index fb50f48a0..d6fa072fd 100644
 | ||||
| --- a/data/80-udisks2.rules
 | ||||
| +++ b/data/80-udisks2.rules
 | ||||
| @@ -122,6 +122,7 @@ ENV{ID_PART_ENTRY_SCHEME}=="mac", ENV{ID_PART_ENTRY_TYPE}=="Apple_Bootstrap", EN
 | ||||
|   | ||||
|  # Apple Boot partitions | ||||
|  ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_TYPE}=="426f6f74-0000-11aa-aa11-00306543ecac", ENV{UDISKS_IGNORE}="1" | ||||
| +ENV{ID_FS_LABEL}=="ANACONDA", ENV{ID_PART_ENTRY_TYPE}=="48465300-0000-11aa-aa11-00306543ecac|0xaf", ENV{UDISKS_IGNORE}="1"
 | ||||
|   | ||||
|  # special DOS partition types (EFI, hidden, etc.) and RAID/LVM | ||||
|  # see http://www.win.tue.nl/~aeb/partitions/partition_types-1.html | ||||
							
								
								
									
										60
									
								
								udisks-2.10.0-ata_conf_apply_GTask.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								udisks-2.10.0-ata_conf_apply_GTask.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| commit 6ff556afabd490feb6c4b29f9e91e81d64e2c0ed | ||||
| Author: Tomas Bzatek <tbzatek@redhat.com> | ||||
| Date:   Tue Mar 23 12:56:40 2021 +0100 | ||||
| 
 | ||||
|     udiskslinuxdriveata: Use GTask to apply configuration in a thread | ||||
|      | ||||
|     Should fix a leaking GThread without a need to join or track it anyhow. | ||||
| 
 | ||||
| diff --git a/src/udiskslinuxdriveata.c b/src/udiskslinuxdriveata.c
 | ||||
| index 5ebdcd76..2de138cd 100644
 | ||||
| --- a/src/udiskslinuxdriveata.c
 | ||||
| +++ b/src/udiskslinuxdriveata.c
 | ||||
| @@ -1625,10 +1625,13 @@ apply_conf_data_free (ApplyConfData *data)
 | ||||
|    g_free (data); | ||||
|  } | ||||
|   | ||||
| -static gpointer
 | ||||
| -apply_configuration_thread_func (gpointer user_data)
 | ||||
| +static void
 | ||||
| +apply_configuration_thread_func (GTask        *task,
 | ||||
| +                                 gpointer      source_object,
 | ||||
| +                                 gpointer      task_data,
 | ||||
| +                                 GCancellable *cancellable)
 | ||||
|  { | ||||
| -  ApplyConfData *data = user_data;
 | ||||
| +  ApplyConfData *data = task_data;
 | ||||
|    UDisksDaemon *daemon; | ||||
|    const gchar *device_file = NULL; | ||||
|    gint fd = -1; | ||||
| @@ -1799,8 +1802,6 @@ apply_configuration_thread_func (gpointer user_data)
 | ||||
|   out: | ||||
|    if (fd != -1) | ||||
|      close (fd); | ||||
| -  apply_conf_data_free (data);
 | ||||
| -  return NULL;
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
| @@ -1819,6 +1820,7 @@ udisks_linux_drive_ata_apply_configuration (UDisksLinuxDriveAta *drive,
 | ||||
|  { | ||||
|    gboolean has_conf = FALSE; | ||||
|    ApplyConfData *data = NULL; | ||||
| +  GTask *task;
 | ||||
|   | ||||
|    data = g_new0 (ApplyConfData, 1); | ||||
|    data->ata_pm_standby = -1; | ||||
| @@ -1862,9 +1864,10 @@ udisks_linux_drive_ata_apply_configuration (UDisksLinuxDriveAta *drive,
 | ||||
|    /* this can easily take a long time and thus block (the drive may be in standby mode | ||||
|     * and needs to spin up) - so run it in a thread | ||||
|     */ | ||||
| -  g_thread_new ("apply-conf-thread",
 | ||||
| -                apply_configuration_thread_func,
 | ||||
| -                data);
 | ||||
| +  task = g_task_new (data->object, NULL, NULL, NULL);
 | ||||
| +  g_task_set_task_data (task, data, (GDestroyNotify) apply_conf_data_free);
 | ||||
| +  g_task_run_in_thread (task, apply_configuration_thread_func);
 | ||||
| +  g_object_unref (task);
 | ||||
|   | ||||
|    data = NULL; /* don't free data below */ | ||||
|   | ||||
							
								
								
									
										24
									
								
								udisks-2.10.0-dosfstools_4.2-reread_part.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								udisks-2.10.0-dosfstools_4.2-reread_part.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| commit d58ebcc32b583371dd73ab7f4c7be5191674ca62 | ||||
| Author: Tomas Bzatek <tbzatek@redhat.com> | ||||
| Date:   Wed Mar 17 18:52:22 2021 +0100 | ||||
| 
 | ||||
|     udiskslinuxblock: Re-read partition table after creating FAT filesystem | ||||
|      | ||||
|     Might not be needed after reverting mkfs.vfat behaviour back | ||||
|     to the legacy way, added just as a precautionary measure. | ||||
| 
 | ||||
| diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c
 | ||||
| index 901426ad..69161b61 100644
 | ||||
| --- a/src/udiskslinuxblock.c
 | ||||
| +++ b/src/udiskslinuxblock.c
 | ||||
| @@ -2913,7 +2913,9 @@ static inline gboolean
 | ||||
|  need_partprobe_after_mkfs (const gchar *fs_type) | ||||
|  { | ||||
|    /* udftools makes fake MBR since the 2.0 release */ | ||||
| -  return (g_strcmp0 (fs_type, "udf") == 0);
 | ||||
| +  /* dosfstools makes fake MBR since the 4.2 release */
 | ||||
| +  return (g_strcmp0 (fs_type, "udf") == 0 ||
 | ||||
| +          g_strcmp0 (fs_type, "vfat") == 0);
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
							
								
								
									
										75
									
								
								udisks-2.10.0-dosfstools_4.2.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								udisks-2.10.0-dosfstools_4.2.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| commit ef1979d8cbfb8ad976de0af21a70f8c0f98fbbe9 | ||||
| Author: Tomas Bzatek <tbzatek@redhat.com> | ||||
| Date:   Wed Mar 17 18:50:19 2021 +0100 | ||||
| 
 | ||||
|     udiskslinuxfsinfo: Add dosfstools >= 4.2 quirks | ||||
|      | ||||
|     Reverting back the legacy behaviour with no protective (fake) MBR | ||||
|     created while making new FAT filesystem on an unpartitioned block device. | ||||
|      | ||||
|     Added a label clear functionality as well. | ||||
| 
 | ||||
| diff --git a/src/udiskslinuxfsinfo.c b/src/udiskslinuxfsinfo.c
 | ||||
| index 15af26c8..f18b9b80 100644
 | ||||
| --- a/src/udiskslinuxfsinfo.c
 | ||||
| +++ b/src/udiskslinuxfsinfo.c
 | ||||
| @@ -21,6 +21,8 @@
 | ||||
|  #include <string.h> | ||||
|  #include <glib.h> | ||||
|   | ||||
| +#include <blockdev/exec.h>
 | ||||
| +
 | ||||
|  #include "config.h" | ||||
|  #include "udiskslinuxfsinfo.h" | ||||
|  #include "udisksconfigmanager.h" | ||||
| @@ -236,6 +238,19 @@ const FSInfo _fs_info[] =
 | ||||
|      }, | ||||
|    }; | ||||
|   | ||||
| +/* workaround for dosfstools >= 4.2 */
 | ||||
| +static const FSInfo vfat_dosfstools_42 =
 | ||||
| +    {
 | ||||
| +      FS_VFAT,
 | ||||
| +      "fatlabel $DEVICE $LABEL",
 | ||||
| +      "fatlabel --reset $DEVICE",
 | ||||
| +      FALSE, /* supports_online_label_rename */
 | ||||
| +      FALSE, /* supports_owners */
 | ||||
| +      "mkfs.vfat -I -n $LABEL --mbr=n $DEVICE",
 | ||||
| +      NULL,
 | ||||
| +      NULL, /* option_no_discard */
 | ||||
| +    };
 | ||||
| +
 | ||||
|  /** | ||||
|   * get_fs_info: | ||||
|   * | ||||
| @@ -248,6 +263,7 @@ const FSInfo _fs_info[] =
 | ||||
|  const FSInfo * | ||||
|  get_fs_info (const gchar *fstype) | ||||
|  { | ||||
| +  const FSInfo *info = NULL;
 | ||||
|    guint n; | ||||
|   | ||||
|    g_return_val_if_fail (fstype != NULL, NULL); | ||||
| @@ -255,10 +271,20 @@ get_fs_info (const gchar *fstype)
 | ||||
|    for (n = 0; n < sizeof(_fs_info)/sizeof(FSInfo); n++) | ||||
|      { | ||||
|        if (strcmp (_fs_info[n].fstype, fstype) == 0) | ||||
| -        return &_fs_info[n];
 | ||||
| +        {
 | ||||
| +          info = &_fs_info[n];
 | ||||
| +          break;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
| +  /* dosfstools >= 4.2 workaround */
 | ||||
| +  if (g_str_equal (fstype, FS_VFAT) &&
 | ||||
| +      bd_utils_check_util_version ("mkfs.vfat", "4.2", "--help", "mkfs.fat\\s+([\\d\\.]+).+", NULL))
 | ||||
| +    {
 | ||||
| +      info = &vfat_dosfstools_42;
 | ||||
|      } | ||||
|   | ||||
| -  return NULL;
 | ||||
| +  return info;
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
							
								
								
									
										136
									
								
								udisks-2.10.0-module-names.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								udisks-2.10.0-module-names.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,136 @@ | ||||
| commit e062c17e3829f3c04c25b5f6fc17ccc4491befa8 | ||||
| Author: Tomas Bzatek <tbzatek@redhat.com> | ||||
| Date:   Tue Mar 23 16:48:08 2021 +0100 | ||||
| 
 | ||||
|     modules: Limit module name to alphanumeric characters and -_ separators | ||||
|      | ||||
|     A hardening feature as long as the module name is directly involved | ||||
|     in filename creation. | ||||
| 
 | ||||
| diff --git a/doc/udisks2-sections.txt.daemon.sections.in b/doc/udisks2-sections.txt.daemon.sections.in
 | ||||
| index 16eaf74e..204ca897 100644
 | ||||
| --- a/doc/udisks2-sections.txt.daemon.sections.in
 | ||||
| +++ b/doc/udisks2-sections.txt.daemon.sections.in
 | ||||
| @@ -312,6 +312,7 @@ udisks_daemon_util_get_free_mdraid_device
 | ||||
|  udisks_ata_identify_get_word | ||||
|  udisks_daemon_util_trigger_uevent | ||||
|  udisks_daemon_util_trigger_uevent_sync | ||||
| +udisks_module_validate_name
 | ||||
|  </SECTION> | ||||
|   | ||||
|  <SECTION> | ||||
| diff --git a/src/udisksconfigmanager.c b/src/udisksconfigmanager.c
 | ||||
| index 9558e276..5868e864 100644
 | ||||
| --- a/src/udisksconfigmanager.c
 | ||||
| +++ b/src/udisksconfigmanager.c
 | ||||
| @@ -26,6 +26,7 @@
 | ||||
|  #include "udiskslogging.h" | ||||
|  #include "udisksdaemontypes.h" | ||||
|  #include "udisksconfigmanager.h" | ||||
| +#include "udisksdaemonutil.h"
 | ||||
|   | ||||
|  struct _UDisksConfigManager { | ||||
|    GObject parent_instance; | ||||
| @@ -60,6 +61,8 @@ enum
 | ||||
|  #define DEFAULTS_GROUP_NAME "defaults" | ||||
|  #define DEFAULTS_ENCRYPTION_KEY "encryption" | ||||
|   | ||||
| +#define MODULES_ALL_ARG "*"
 | ||||
| +
 | ||||
|  static void | ||||
|  udisks_config_manager_get_property (GObject    *object, | ||||
|                                      guint       property_id, | ||||
| @@ -170,7 +173,16 @@ parse_config_file (UDisksConfigManager         *manager,
 | ||||
|              { | ||||
|                modules_tmp = modules; | ||||
|                for (module_i = *modules_tmp; module_i; module_i = *++modules_tmp) | ||||
| -                *out_modules = g_list_append (*out_modules, g_strdup (g_strstrip (module_i)));
 | ||||
| +                {
 | ||||
| +                  g_strstrip (module_i);
 | ||||
| +                  if (! udisks_module_validate_name (module_i) && !g_str_equal (module_i, MODULES_ALL_ARG))
 | ||||
| +                    {
 | ||||
| +                      g_warning ("Invalid module name '%s' specified in the %s config file.",
 | ||||
| +                                 module_i, conf_filename);
 | ||||
| +                      continue;
 | ||||
| +                    }
 | ||||
| +                  *out_modules = g_list_append (*out_modules, g_strdup (module_i));
 | ||||
| +                }
 | ||||
|                g_strfreev (modules); | ||||
|              } | ||||
|          } | ||||
| @@ -397,7 +409,7 @@ udisks_config_manager_get_modules_all (UDisksConfigManager *manager)
 | ||||
|   | ||||
|    parse_config_file (manager, NULL, NULL, &modules); | ||||
|   | ||||
| -  ret = !modules || (g_strcmp0 (modules->data, "*") == 0 && g_list_length (modules) == 1);
 | ||||
| +  ret = !modules || (g_strcmp0 (modules->data, MODULES_ALL_ARG) == 0 && g_list_length (modules) == 1);
 | ||||
|   | ||||
|    g_list_free_full (modules, (GDestroyNotify) g_free); | ||||
|   | ||||
| diff --git a/src/udisksdaemonutil.c b/src/udisksdaemonutil.c
 | ||||
| index 60134765..1695b524 100644
 | ||||
| --- a/src/udisksdaemonutil.c
 | ||||
| +++ b/src/udisksdaemonutil.c
 | ||||
| @@ -1880,3 +1880,29 @@ udisks_daemon_util_trigger_uevent_sync (UDisksDaemon *daemon,
 | ||||
|  } | ||||
|   | ||||
|  /* ---------------------------------------------------------------------------------------------------- */ | ||||
| +
 | ||||
| +/**
 | ||||
| + * udisks_module_validate_name:
 | ||||
| + * @module_name: A udisks2 module name.
 | ||||
| + *
 | ||||
| + * Checks the string for a valid udisks2 module name. Only alphanumeric characters
 | ||||
| + * along with the '-' and '_' separators are permitted.
 | ||||
| + *
 | ||||
| + * Returns: %TRUE if the string is a valid udisks2 module name, %FALSE otherwise.
 | ||||
| + */
 | ||||
| +gboolean
 | ||||
| +udisks_module_validate_name (const gchar *module_name)
 | ||||
| +{
 | ||||
| +  int i;
 | ||||
| +
 | ||||
| +  for (i = 0; module_name[i] != '\0'; i++)
 | ||||
| +    /* going ASCII, will disqualify any UTF-* string */
 | ||||
| +    if (! g_ascii_isalnum (module_name[i]) &&
 | ||||
| +        module_name[i] != '-' &&
 | ||||
| +        module_name[i] != '_')
 | ||||
| +      return FALSE;
 | ||||
| +
 | ||||
| +  return TRUE;
 | ||||
| +}
 | ||||
| +
 | ||||
| +/* ---------------------------------------------------------------------------------------------------- */
 | ||||
| diff --git a/src/udisksdaemonutil.h b/src/udisksdaemonutil.h
 | ||||
| index 2d7ac981..df584de4 100644
 | ||||
| --- a/src/udisksdaemonutil.h
 | ||||
| +++ b/src/udisksdaemonutil.h
 | ||||
| @@ -129,6 +129,8 @@ gchar *udisks_daemon_util_get_free_mdraid_device (void);
 | ||||
|   | ||||
|  guint16 udisks_ata_identify_get_word (const guchar *identify_data, guint word_number); | ||||
|   | ||||
| +gboolean udisks_module_validate_name (const gchar *module_name);
 | ||||
| +
 | ||||
|  /* Utility macro for policy verification. */ | ||||
|  #define UDISKS_DAEMON_CHECK_AUTHORIZATION(daemon,                   \ | ||||
|                                            object,                   \ | ||||
| diff --git a/src/udiskslinuxmanager.c b/src/udiskslinuxmanager.c
 | ||||
| index 8af65d97..26d8a5d7 100644
 | ||||
| --- a/src/udiskslinuxmanager.c
 | ||||
| +++ b/src/udiskslinuxmanager.c
 | ||||
| @@ -956,6 +956,15 @@ handle_enable_module (UDisksManager         *object,
 | ||||
|    UDisksLinuxManager *manager = UDISKS_LINUX_MANAGER (object); | ||||
|    EnableModulesData *data; | ||||
|   | ||||
| +  if (! udisks_module_validate_name (arg_name))
 | ||||
| +    {
 | ||||
| +      g_dbus_method_invocation_return_error (invocation,
 | ||||
| +                                             G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
 | ||||
| +                                             "Requested module name '%s' is not a valid udisks2 module name.",
 | ||||
| +                                             arg_name);
 | ||||
| +      return TRUE;
 | ||||
| +    }
 | ||||
| +
 | ||||
|    if (! arg_enable) | ||||
|      { | ||||
|        /* TODO: implement proper module unloading */ | ||||
							
								
								
									
										17
									
								
								udisks2.spec
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								udisks2.spec
									
									
									
									
									
								
							| @ -48,10 +48,16 @@ | ||||
| Name:    udisks2 | ||||
| Summary: Disk Manager | ||||
| Version: 2.9.2 | ||||
| Release: 2%{?dist} | ||||
| Release: 3%{?dist} | ||||
| License: GPLv2+ | ||||
| URL:     https://github.com/storaged-project/udisks | ||||
| Source0: https://github.com/storaged-project/udisks/releases/download/udisks-%{version}/udisks-%{version}.tar.bz2 | ||||
| Patch0:  udisks-2.10.0-dosfstools_4.2.patch | ||||
| Patch1:  udisks-2.10.0-dosfstools_4.2-reread_part.patch | ||||
| Patch2:  udisks-2.10.0-module-names.patch | ||||
| Patch3:  udisks-2.10.0-ata_conf_apply_GTask.patch | ||||
| # https://github.com/storaged-project/udisks/pull/847 | ||||
| Patch4:  ignore-apple-boot-part.patch | ||||
| 
 | ||||
| BuildRequires: make | ||||
| BuildRequires: glib2-devel >= %{glib2_version} | ||||
| @ -240,8 +246,9 @@ This package contains module for ZRAM configuration. | ||||
| %endif | ||||
| 
 | ||||
| %prep | ||||
| %setup -q -n udisks-%{version} | ||||
| %autosetup -p1 -n udisks-%{version} | ||||
| sed -i udisks/udisks2.conf.in -e "s/encryption=luks1/encryption=%{default_luks_encryption}/" | ||||
| rm -f src/tests/dbus-tests/config_h.py | ||||
| 
 | ||||
| %build | ||||
| autoreconf -ivf | ||||
| @ -426,6 +433,12 @@ fi | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Fri Mar 26 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.2-3 | ||||
| - Fix FAT mkfs with dosfstools >= 4.2 | ||||
| - udiskslinuxdriveata: Use GTask to apply configuration in a thread | ||||
| - Limit allowed module names | ||||
| - 80-udisks2.rules: Ignore Apple boot partition from livecd-tools | ||||
| 
 | ||||
| * Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 2.9.2-2 | ||||
| - Rebuilt for updated systemd-rpm-macros | ||||
|   See https://pagure.io/fesco/issue/2583. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user