Skip to content

Commit 5f9cd5b

Browse files
Track permissions as bytes
Because we expect certain inputs, we don't need chars. The code also doesn't need to validate exact lengths. This reduces the generated code size slightly.
1 parent 016f80a commit 5f9cd5b

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

src/symbolize/gimli/parse_running_mmaps_unix.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub(super) struct MapsEntry {
2020
/// x = execute
2121
/// s = shared
2222
/// p = private (copy on write)
23-
perms: [char; 4],
23+
perms: [u8; 4],
2424
/// Offset into the file (or "whatever").
2525
offset: u64,
2626
/// device (major, minor)
@@ -132,14 +132,12 @@ impl FromStr for MapsEntry {
132132
} else {
133133
return Err("Couldn't parse address range");
134134
};
135-
let perms: [char; 4] = {
136-
let mut chars = perms_str.chars();
137-
let mut c = || chars.next().ok_or("insufficient perms");
138-
let perms = [c()?, c()?, c()?, c()?];
139-
if chars.next().is_some() {
140-
return Err("too many perms");
141-
}
142-
perms
135+
let perms = if let &[r, w, x, p, ..] = perms_str.as_bytes() {
136+
// If a system in the future adds a 5th field to the permission list,
137+
// there's no reason to assume previous fields were invalidated.
138+
[r, w, x, p]
139+
} else {
140+
return Err("less than 4 perms");
143141
};
144142
let offset = hex64(offset_str)?;
145143
let dev = if let Some((major, minor)) = dev_str.split_once(':') {
@@ -172,7 +170,7 @@ fn check_maps_entry_parsing_64bit() {
172170
.unwrap(),
173171
MapsEntry {
174172
address: (0xffffffffff600000, 0xffffffffff601000),
175-
perms: ['-', '-', 'x', 'p'],
173+
perms: *b"--xp",
176174
offset: 0x00000000,
177175
dev: (0x00, 0x00),
178176
inode: 0x0,
@@ -187,7 +185,7 @@ fn check_maps_entry_parsing_64bit() {
187185
.unwrap(),
188186
MapsEntry {
189187
address: (0x7f5985f46000, 0x7f5985f48000),
190-
perms: ['r', 'w', '-', 'p'],
188+
perms: *b"rw-p",
191189
offset: 0x00039000,
192190
dev: (0x103, 0x06),
193191
inode: 0x76021795,
@@ -200,7 +198,7 @@ fn check_maps_entry_parsing_64bit() {
200198
.unwrap(),
201199
MapsEntry {
202200
address: (0x35b1a21000, 0x35b1a22000),
203-
perms: ['r', 'w', '-', 'p'],
201+
perms: *b"rw-p",
204202
offset: 0x00000000,
205203
dev: (0x00, 0x00),
206204
inode: 0x0,
@@ -224,7 +222,7 @@ fn check_maps_entry_parsing_32bit() {
224222
.unwrap(),
225223
MapsEntry {
226224
address: (0x08056000, 0x08077000),
227-
perms: ['r', 'w', '-', 'p'],
225+
perms: *b"rw-p",
228226
offset: 0x00000000,
229227
dev: (0x00, 0x00),
230228
inode: 0x0,
@@ -239,7 +237,7 @@ fn check_maps_entry_parsing_32bit() {
239237
.unwrap(),
240238
MapsEntry {
241239
address: (0xb7c79000, 0xb7e02000),
242-
perms: ['r', '-', '-', 'p'],
240+
perms: *b"r--p",
243241
offset: 0x00000000,
244242
dev: (0x08, 0x01),
245243
inode: 0x60662705,
@@ -252,7 +250,7 @@ fn check_maps_entry_parsing_32bit() {
252250
.unwrap(),
253251
MapsEntry {
254252
address: (0xb7e02000, 0xb7e03000),
255-
perms: ['r', 'w', '-', 'p'],
253+
perms: *b"rw-p",
256254
offset: 0x00000000,
257255
dev: (0x00, 0x00),
258256
inode: 0x0,

0 commit comments

Comments
 (0)