Based on the discussion about the signed character field for the year, I went through all fields in the iso9660 and rockridge standards to see whether they should used signed or unsigned characters. Only a single 8-bit value is defined as signed per 'section 7.1.2': the timezone offset in a timestamp, this has always been handled correctly through explicit sign-extension. All others are either '7.1.1 8-bit unsigned numerical values' or composite fields. I also read the linux source code and came to the same conclusion, also I could not find any other part of the implementation that actually behaves differently for signed or unsigned values. Since it is still ambigous to use plain 'char' in interface definitions, I'm changing all fields representing numbers and reserved bytes to the unambiguous '__u8'. Fields that hold actual strings are left as 'char' arrays. I built the code with '-Wpointer-sign -Wsign-compare' to see if anything got left out, but couldn't find anything wrong with the remaining warnings. This patch should not change runtime behavior and does not need to be backported.
Showing the changes to include/uapi/linux (1 of 3 files). Show all
Unified · Split
| @@ -12,10 +12,10 @@ · 11 unmodified lines | |||
| 12 | #define ISODCL(from, to) (to - from + 1) | 12 | #define ISODCL(from, to) (to - from + 1) |
| 13 | 13 | ||
| 14 | struct iso_volume_descriptor { | 14 | struct iso_volume_descriptor { |
| 15 | char type[ISODCL(1,1)]; /* 711 */ | 15 | __u8 type[ISODCL(1,1)]; /* 711 */ |
| 16 | char id[ISODCL(2,6)]; | 16 | char id[ISODCL(2,6)]; |
| 17 | char version[ISODCL(7,7)]; | 17 | __u8 version[ISODCL(7,7)]; |
| 18 | char data[ISODCL(8,2048)]; | 18 | __u8 data[ISODCL(8,2048)]; |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | /* volume descriptor types */ | 21 | /* volume descriptor types */ |
| @@ -26,24 +26,24 @@ struct iso_volume_descriptor { · 4 unmodified lines | |||
| 26 | #define ISO_STANDARD_ID "CD001" | 26 | #define ISO_STANDARD_ID "CD001" |
| 27 | 27 | ||
| 28 | struct iso_primary_descriptor { | 28 | struct iso_primary_descriptor { |
| 29 | char type [ISODCL ( 1, 1)]; /* 711 */ | 29 | __u8 type [ISODCL ( 1, 1)]; /* 711 */ |
| 30 | char id [ISODCL ( 2, 6)]; | 30 | char id [ISODCL ( 2, 6)]; |
| 31 | char version [ISODCL ( 7, 7)]; /* 711 */ | 31 | __u8 version [ISODCL ( 7, 7)]; /* 711 */ |
| 32 | char unused1 [ISODCL ( 8, 8)]; | 32 | __u8 unused1 [ISODCL ( 8, 8)]; |
| 33 | char system_id [ISODCL ( 9, 40)]; /* achars */ | 33 | char system_id [ISODCL ( 9, 40)]; /* achars */ |
| 34 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ | 34 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ |
| 35 | char unused2 [ISODCL ( 73, 80)]; | 35 | __u8 unused2 [ISODCL ( 73, 80)]; |
| 36 | char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ | 36 | __u8 volume_space_size [ISODCL ( 81, 88)]; /* 733 */ |
| 37 | char unused3 [ISODCL ( 89, 120)]; | 37 | __u8 unused3 [ISODCL ( 89, 120)]; |
| 38 | char volume_set_size [ISODCL (121, 124)]; /* 723 */ | 38 | __u8 volume_set_size [ISODCL (121, 124)]; /* 723 */ |
| 39 | char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ | 39 | __u8 volume_sequence_number [ISODCL (125, 128)]; /* 723 */ |
| 40 | char logical_block_size [ISODCL (129, 132)]; /* 723 */ | 40 | __u8 logical_block_size [ISODCL (129, 132)]; /* 723 */ |
| 41 | char path_table_size [ISODCL (133, 140)]; /* 733 */ | 41 | __u8 path_table_size [ISODCL (133, 140)]; /* 733 */ |
| 42 | char type_l_path_table [ISODCL (141, 144)]; /* 731 */ | 42 | __u8 type_l_path_table [ISODCL (141, 144)]; /* 731 */ |
| 43 | char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ | 43 | __u8 opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ |
| 44 | char type_m_path_table [ISODCL (149, 152)]; /* 732 */ | 44 | __u8 type_m_path_table [ISODCL (149, 152)]; /* 732 */ |
| 45 | char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ | 45 | __u8 opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ |
| 46 | char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ | 46 | __u8 root_directory_record [ISODCL (157, 190)]; /* 9.1 */ |
| 47 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ | 47 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ |
| 48 | char publisher_id [ISODCL (319, 446)]; /* achars */ | 48 | char publisher_id [ISODCL (319, 446)]; /* achars */ |
| 49 | char preparer_id [ISODCL (447, 574)]; /* achars */ | 49 | char preparer_id [ISODCL (447, 574)]; /* achars */ |
| @@ -51,36 +51,36 @@ struct iso_primary_descriptor { · 1 unmodified line | |||
| 51 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ | 51 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ |
| 52 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ | 52 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ |
| 53 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ | 53 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ |
| 54 | char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ | 54 | __u8 creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ |
| 55 | char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ | 55 | __u8 modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ |
| 56 | char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ | 56 | __u8 expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ |
| 57 | char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ | 57 | __u8 effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ |
| 58 | char file_structure_version [ISODCL (882, 882)]; /* 711 */ | 58 | __u8 file_structure_version [ISODCL (882, 882)]; /* 711 */ |
| 59 | char unused4 [ISODCL (883, 883)]; | 59 | __u8 unused4 [ISODCL (883, 883)]; |
| 60 | char application_data [ISODCL (884, 1395)]; | 60 | __u8 application_data [ISODCL (884, 1395)]; |
| 61 | char unused5 [ISODCL (1396, 2048)]; | 61 | __u8 unused5 [ISODCL (1396, 2048)]; |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | /* Almost the same as the primary descriptor but two fields are specified */ | 64 | /* Almost the same as the primary descriptor but two fields are specified */ |
| 65 | struct iso_supplementary_descriptor { | 65 | struct iso_supplementary_descriptor { |
| 66 | char type [ISODCL ( 1, 1)]; /* 711 */ | 66 | __u8 type [ISODCL ( 1, 1)]; /* 711 */ |
| 67 | char id [ISODCL ( 2, 6)]; | 67 | char id [ISODCL ( 2, 6)]; |
| 68 | char version [ISODCL ( 7, 7)]; /* 711 */ | 68 | __u8 version [ISODCL ( 7, 7)]; /* 711 */ |
| 69 | char flags [ISODCL ( 8, 8)]; /* 853 */ | 69 | __u8 flags [ISODCL ( 8, 8)]; /* 853 */ |
| 70 | char system_id [ISODCL ( 9, 40)]; /* achars */ | 70 | char system_id [ISODCL ( 9, 40)]; /* achars */ |
| 71 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ | 71 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ |
| 72 | char unused2 [ISODCL ( 73, 80)]; | 72 | __u8 unused2 [ISODCL ( 73, 80)]; |
| 73 | char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ | 73 | __u8 volume_space_size [ISODCL ( 81, 88)]; /* 733 */ |
| 74 | char escape [ISODCL ( 89, 120)]; /* 856 */ | 74 | __u8 escape [ISODCL ( 89, 120)]; /* 856 */ |
| 75 | char volume_set_size [ISODCL (121, 124)]; /* 723 */ | 75 | __u8 volume_set_size [ISODCL (121, 124)]; /* 723 */ |
| 76 | char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ | 76 | __u8 volume_sequence_number [ISODCL (125, 128)]; /* 723 */ |
| 77 | char logical_block_size [ISODCL (129, 132)]; /* 723 */ | 77 | __u8 logical_block_size [ISODCL (129, 132)]; /* 723 */ |
| 78 | char path_table_size [ISODCL (133, 140)]; /* 733 */ | 78 | __u8 path_table_size [ISODCL (133, 140)]; /* 733 */ |
| 79 | char type_l_path_table [ISODCL (141, 144)]; /* 731 */ | 79 | __u8 type_l_path_table [ISODCL (141, 144)]; /* 731 */ |
| 80 | char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ | 80 | __u8 opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ |
| 81 | char type_m_path_table [ISODCL (149, 152)]; /* 732 */ | 81 | __u8 type_m_path_table [ISODCL (149, 152)]; /* 732 */ |
| 82 | char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ | 82 | __u8 opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ |
| 83 | char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ | 83 | __u8 root_directory_record [ISODCL (157, 190)]; /* 9.1 */ |
| 84 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ | 84 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ |
| 85 | char publisher_id [ISODCL (319, 446)]; /* achars */ | 85 | char publisher_id [ISODCL (319, 446)]; /* achars */ |
| 86 | char preparer_id [ISODCL (447, 574)]; /* achars */ | 86 | char preparer_id [ISODCL (447, 574)]; /* achars */ |
| @@ -88,54 +88,54 @@ struct iso_supplementary_descriptor { · 1 unmodified line | |||
| 88 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ | 88 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ |
| 89 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ | 89 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ |
| 90 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ | 90 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ |
| 91 | char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ | 91 | __u8 creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ |
| 92 | char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ | 92 | __u8 modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ |
| 93 | char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ | 93 | __u8 expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ |
| 94 | char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ | 94 | __u8 effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ |
| 95 | char file_structure_version [ISODCL (882, 882)]; /* 711 */ | 95 | __u8 file_structure_version [ISODCL (882, 882)]; /* 711 */ |
| 96 | char unused4 [ISODCL (883, 883)]; | 96 | __u8 unused4 [ISODCL (883, 883)]; |
| 97 | char application_data [ISODCL (884, 1395)]; | 97 | __u8 application_data [ISODCL (884, 1395)]; |
| 98 | char unused5 [ISODCL (1396, 2048)]; | 98 | __u8 unused5 [ISODCL (1396, 2048)]; |
| 99 | }; | 99 | }; |
| 100 | 100 | ||
| 101 | 101 | ||
| 102 | #define HS_STANDARD_ID "CDROM" | 102 | #define HS_STANDARD_ID "CDROM" |
| 103 | 103 | ||
| 104 | struct hs_volume_descriptor { | 104 | struct hs_volume_descriptor { |
| 105 | char foo [ISODCL ( 1, 8)]; /* 733 */ | 105 | __u8 foo [ISODCL ( 1, 8)]; /* 733 */ |
| 106 | char type [ISODCL ( 9, 9)]; /* 711 */ | 106 | __u8 type [ISODCL ( 9, 9)]; /* 711 */ |
| 107 | char id [ISODCL ( 10, 14)]; | 107 | char id [ISODCL ( 10, 14)]; |
| 108 | char version [ISODCL ( 15, 15)]; /* 711 */ | 108 | __u8 version [ISODCL ( 15, 15)]; /* 711 */ |
| 109 | char data[ISODCL(16,2048)]; | 109 | __u8 data[ISODCL(16,2048)]; |
| 110 | }; | 110 | }; |
| 111 | 111 | ||
| 112 | 112 | ||
| 113 | struct hs_primary_descriptor { | 113 | struct hs_primary_descriptor { |
| 114 | char foo [ISODCL ( 1, 8)]; /* 733 */ | 114 | __u8 foo [ISODCL ( 1, 8)]; /* 733 */ |
| 115 | char type [ISODCL ( 9, 9)]; /* 711 */ | 115 | __u8 type [ISODCL ( 9, 9)]; /* 711 */ |
| 116 | char id [ISODCL ( 10, 14)]; | 116 | __u8 id [ISODCL ( 10, 14)]; |
| 117 | char version [ISODCL ( 15, 15)]; /* 711 */ | 117 | __u8 version [ISODCL ( 15, 15)]; /* 711 */ |
| 118 | char unused1 [ISODCL ( 16, 16)]; /* 711 */ | 118 | __u8 unused1 [ISODCL ( 16, 16)]; /* 711 */ |
| 119 | char system_id [ISODCL ( 17, 48)]; /* achars */ | 119 | char system_id [ISODCL ( 17, 48)]; /* achars */ |
| 120 | char volume_id [ISODCL ( 49, 80)]; /* dchars */ | 120 | char volume_id [ISODCL ( 49, 80)]; /* dchars */ |
| 121 | char unused2 [ISODCL ( 81, 88)]; /* 733 */ | 121 | __u8 unused2 [ISODCL ( 81, 88)]; /* 733 */ |
| 122 | char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ | 122 | __u8 volume_space_size [ISODCL ( 89, 96)]; /* 733 */ |
| 123 | char unused3 [ISODCL ( 97, 128)]; /* 733 */ | 123 | __u8 unused3 [ISODCL ( 97, 128)]; /* 733 */ |
| 124 | char volume_set_size [ISODCL (129, 132)]; /* 723 */ | 124 | __u8 volume_set_size [ISODCL (129, 132)]; /* 723 */ |
| 125 | char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ | 125 | __u8 volume_sequence_number [ISODCL (133, 136)]; /* 723 */ |
| 126 | char logical_block_size [ISODCL (137, 140)]; /* 723 */ | 126 | __u8 logical_block_size [ISODCL (137, 140)]; /* 723 */ |
| 127 | char path_table_size [ISODCL (141, 148)]; /* 733 */ | 127 | __u8 path_table_size [ISODCL (141, 148)]; /* 733 */ |
| 128 | char type_l_path_table [ISODCL (149, 152)]; /* 731 */ | 128 | __u8 type_l_path_table [ISODCL (149, 152)]; /* 731 */ |
| 129 | char unused4 [ISODCL (153, 180)]; /* 733 */ | 129 | __u8 unused4 [ISODCL (153, 180)]; /* 733 */ |
| 130 | char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ | 130 | __u8 root_directory_record [ISODCL (181, 214)]; /* 9.1 */ |
| 131 | }; | 131 | }; |
| 132 | 132 | ||
| 133 | /* We use this to help us look up the parent inode numbers. */ | 133 | /* We use this to help us look up the parent inode numbers. */ |
| 134 | 134 | ||
| 135 | struct iso_path_table{ | 135 | struct iso_path_table{ |
| 136 | unsigned char name_len[2]; /* 721 */ | 136 | __u8 name_len[2]; /* 721 */ |
| 137 | char extent[4]; /* 731 */ | 137 | __u8 extent[4]; /* 731 */ |
| 138 | char parent[2]; /* 721 */ | 138 | __u8 parent[2]; /* 721 */ |
| 139 | char name[0]; | 139 | char name[0]; |
| 140 | } __attribute__((packed)); | 140 | } __attribute__((packed)); |
| 141 | 141 | ||
| @@ -143,16 +143,16 @@ struct iso_path_table{ · 1 unmodified line | |||
| 143 | there is an extra reserved byte after the flags */ | 143 | there is an extra reserved byte after the flags */ |
| 144 | 144 | ||
| 145 | struct iso_directory_record { | 145 | struct iso_directory_record { |
| 146 | char length [ISODCL (1, 1)]; /* 711 */ | 146 | __u8 length [ISODCL (1, 1)]; /* 711 */ |
| 147 | char ext_attr_length [ISODCL (2, 2)]; /* 711 */ | 147 | __u8 ext_attr_length [ISODCL (2, 2)]; /* 711 */ |
| 148 | char extent [ISODCL (3, 10)]; /* 733 */ | 148 | __u8 extent [ISODCL (3, 10)]; /* 733 */ |
| 149 | char size [ISODCL (11, 18)]; /* 733 */ | 149 | __u8 size [ISODCL (11, 18)]; /* 733 */ |
| 150 | char date [ISODCL (19, 25)]; /* 7 by 711 */ | 150 | __u8 date [ISODCL (19, 25)]; /* 7 by 711 */ |
| 151 | char flags [ISODCL (26, 26)]; | 151 | __u8 flags [ISODCL (26, 26)]; |
| 152 | char file_unit_size [ISODCL (27, 27)]; /* 711 */ | 152 | __u8 file_unit_size [ISODCL (27, 27)]; /* 711 */ |
| 153 | char interleave [ISODCL (28, 28)]; /* 711 */ | 153 | __u8 interleave [ISODCL (28, 28)]; /* 711 */ |
| 154 | char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ | 154 | __u8 volume_sequence_number [ISODCL (29, 32)]; /* 723 */ |
| 155 | unsigned char name_len [ISODCL (33, 33)]; /* 711 */ | 155 | __u8 name_len [ISODCL (33, 33)]; /* 711 */ |
| 156 | char name [0]; | 156 | char name [0]; |
| 157 | } __attribute__((packed)); | 157 | } __attribute__((packed)); |
| 158 | 158 | ||