[gparted] Check disks named on the command line are safe to use too (#755495)



commit 362b2db331b4c31a978bb67232fa7f3ce9ab38c3
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Tue Oct 6 15:15:35 2015 +0100

    Check disks named on the command line are safe to use too (#755495)
    
    When probing for disk devices GParted ensures that libparted is capable
    of handling the sector size safely and that it is a real disk before it
    is shown in the UI.  However when disk devices are named on the command
    line none of these checks are performed.
    
    Libparted versions before v2.2 can only safely handle a sector size of
    512 bytes.  Therefore on old distributions with libparted < v2.2 GParted
    allows unsafe editing of disk devices with larger sector sizes when they
    are named on the command line.  Known to affect these distributions:
        RedHat/CentOS 5   (parted 1.8.1)
        RedHat/CentOS 6   (parted 2.1)
    
    For example (on CentOS 6.5) large sector disk device is ignored when
    probing:
    
        # modprobe scsi_debug dev_size_mb=128 sector_size=4096
        # fgrep scsi_debug /sys/block/*/device/model
        /sys/block/sdd/device/model:scsi_debug
    
        # gparted
        ======================
        libparted : 2.1
        ======================
        Device /dev/sdd has a logical sector size of 4096.  Not all parts of
        GNU Parted support this at the moment, and the working code is
        HIGHLY EXPERIMENTAL.
    
        Ignoring device /dev/sdd with logical sector size of 4096 bytes.
        GParted requires libparted version 2.2 or higher to support devices
        with sector sizes larger than 512 bytes.
    
    However when the device is named it is not ignored and can be edited:
    
        # gparted /dev/sdd
        ======================
        libparted : 2.1
        ======================
        Device /dev/sdd has a logical sector size of 4096.  Not all parts of
        GNU Parted support this at the moment, and the working code is
        HIGHLY EXPERIMENTAL.
    
        /dev/sdd: unrecognised disk label
    
    Apply the same validity checks to disk devices named on the command line
    as to probed ones.
    
    Bug 755495 - GParted allowing partitioning of large sector devices
                 specified on the command line, when built with old
                 libparted which doesn't support it

 src/GParted_Core.cc |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)
---
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 47db4ff..7c91f6a 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -225,22 +225,32 @@ void GParted_Core::set_devices_thread( std::vector<Device> * pdevices )
 
                std::sort( device_paths .begin(), device_paths .end() ) ;
        }
-#ifndef USE_LIBPARTED_DMRAID
        else
        {
                //Device paths were passed in on the command line.
 
-               //Ensure that dmraid device entries are created
                for ( unsigned int t = 0 ; t < device_paths .size() ; t++ ) 
                {
+                       set_thread_status_message( String::ucompose( _("Confirming %1"), device_paths[t] ) );
+
+#ifndef USE_LIBPARTED_DMRAID
+                       // Ensure that dmraid device entries are created
                        if ( dmraid .is_dmraid_supported() &&
                             dmraid .is_dmraid_device( device_paths[t] ) )
                        {
                                dmraid .create_dev_map_entries( dmraid .get_dmraid_name( device_paths [t] ) ) 
;
                        }
+#endif
+
+                       PedDevice* lp_device = ped_device_get( device_paths[t].c_str() );
+                       if ( lp_device )
+                       {
+                               if ( ! useable_device( lp_device ) )
+                                       // Remove this disk device which isn't useable
+                                       device_paths.erase( device_paths.begin() + t );
+                       }
                }
        }
-#endif
 
        for ( unsigned int t = 0 ; t < device_paths .size() ; t++ ) 
        {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]