[gparted] Remove prohibited characters from FAT16/32 labels (#755608)
- From: Curtis Gedak <gedakc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted] Remove prohibited characters from FAT16/32 labels (#755608)
- Date: Sun, 4 Oct 2015 16:14:48 +0000 (UTC)
commit 584137b32b4deed2c20022628baaee6b38570fa5
Author: Albert Young <youngac3 gmail com>
Date: Tue Sep 29 23:02:43 2015 -0500
Remove prohibited characters from FAT16/32 labels (#755608)
GParted waits forever when attempting to set a FAT16/32 file system
label which contains prohibited characters [1][2]. This is because
mlabel asks a question and is waiting for input. Force cancelling the
operation doesn't work either as GParted sends signal 2 (interrupt i.e.
[Ctrl-C]) but mtools commands specifically ignores this and a number of
other signals. Have to kill mlabel with signal 9 (kill) to regain
control of GParted.
Mlabel command with prohibited characters in the label:
# export MTOOLS_SKIP_CHECK=1
# mlabel ::"MYLABEL/ " -i /dev/sdb10
Long file name "MYLABEL/ " contains illegal character(s).
a)utorename A)utorename-all r)ename R)ename-all
s)kip S)kip-all q)uit (aArRsSq):
Remove prohibited characters from FAT16/32 file systems labels when
creating and labelling them. Also upper case the label to meet label
requirements [1][2]. This silently corrects the label and the actual
label applied will be displayed when GParted refreshes after applying
the operation.
[1] Microsoft TechNet: Label
https://technet.microsoft.com/en-us/library/bb490925.aspx
[2] Replicated in Wikikedia: label (command)
https://en.wikipedia.org/wiki/Label_%28command%29
Bug 755608 - Labeling fat16/fat32 partitions hangs if certain characters
included in label
include/fat16.h | 2 +-
src/fat16.cc | 24 +++++++++++++++++++-----
2 files changed, 20 insertions(+), 6 deletions(-)
---
diff --git a/include/fat16.h b/include/fat16.h
index 4285cd3..2c5db2d 100644
--- a/include/fat16.h
+++ b/include/fat16.h
@@ -43,7 +43,7 @@ public:
private:
static const Glib::ustring Change_UUID_Warning [] ;
- const Glib::ustring pad_label( const Glib::ustring &label ) const ;
+ const Glib::ustring sanitize_label( const Glib::ustring & label ) const;
};
} //GParted
diff --git a/src/fat16.cc b/src/fat16.cc
index e203422..7f449c0 100644
--- a/src/fat16.cc
+++ b/src/fat16.cc
@@ -193,7 +193,8 @@ bool fat16::write_label( const Partition & partition, OperationDetail & operatio
if ( partition.get_filesystem_label().empty() )
cmd = "mlabel -c :: -i " + partition.get_path();
else
- cmd = "mlabel ::\"" + pad_label( partition.get_filesystem_label() ) + "\" -i " +
partition.get_path();
+ cmd = "mlabel ::\"" + sanitize_label( partition.get_filesystem_label() ) + "\" -i "
+ + partition.get_path();
return ! execute_command( cmd, operationdetail, EXEC_CHECK_STATUS );
}
@@ -229,7 +230,7 @@ bool fat16::create( const Partition & new_partition, OperationDetail & operation
{
Glib::ustring fat_size = specific_type == FS_FAT16 ? "16" : "32" ;
return ! execute_command( create_cmd + " -F" + fat_size + " -v -I -n \"" +
- pad_label( new_partition.get_filesystem_label() ) + "\" " +
+ sanitize_label( new_partition.get_filesystem_label() ) + "\" " +
new_partition.get_path(),
operationdetail,
EXEC_CHECK_STATUS|EXEC_CANCEL_SAFE );
@@ -246,11 +247,24 @@ bool fat16::check_repair( const Partition & partition, OperationDetail & operati
//Private methods
-//Pad fat label with spaces to prevent mlabel writing corrupted labels. See bug #700228
-const Glib::ustring fat16::pad_label( const Glib::ustring &label ) const
+const Glib::ustring fat16::sanitize_label( const Glib::ustring &label ) const
{
- Glib::ustring new_label = label ;
+ Glib::ustring uppercase_label = label.uppercase();
+ Glib::ustring new_label;
+
+ // Copy uppercase label excluding prohibited characters.
+ // [1] Microsoft TechNet: Label
+ // https://technet.microsoft.com/en-us/library/bb490925.aspx
+ // [2] Replicated in Wikikedia: label (command)
+ // https://en.wikipedia.org/wiki/Label_%28command%29
+ Glib::ustring prohibited_chars( "*?.,;:/\\|+=<>[]" );
+ for ( unsigned int i = 0 ; i < label.size() ; i ++ )
+ if ( prohibited_chars.find( uppercase_label[i] ) == Glib::ustring::npos )
+ new_label.push_back( uppercase_label[i] );
+
+ // Pad with spaces to prevent mlabel writing corrupted labels. See bug #700228.
new_label .resize( Utils::get_filesystem_label_maxlength( specific_type ), ' ' ) ;
+
return new_label ;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]