|  | @@ -43,24 +43,17 @@ impl Tag {
 | 
											
												
													
														|  |      /// UTF-8 Rust string slice without a terminating null byte or an error is
 |  |      /// UTF-8 Rust string slice without a terminating null byte or an error is
 | 
											
												
													
														|  |      /// returned.
 |  |      /// returned.
 | 
											
												
													
														|  |      pub fn get_dst_str_slice(bytes: &[u8]) -> Result<&str, Utf8Error> {
 |  |      pub fn get_dst_str_slice(bytes: &[u8]) -> Result<&str, Utf8Error> {
 | 
											
												
													
														|  | -        if bytes.is_empty() {
 |  | 
 | 
											
												
													
														|  | -            // Very unlikely. A sane bootloader would omit the tag in this case.
 |  | 
 | 
											
												
													
														|  | -            // But better be safe.
 |  | 
 | 
											
												
													
														|  | -            return Ok("");
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // Determine length of string before first NUL character
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        let length = match bytes.iter().position(|ch| (*ch) == 0x00) {
 | 
											
												
													
														|  | 
 |  | +            // Unterminated string case:
 | 
											
												
													
														|  | 
 |  | +            None => bytes.len(),
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // Return without a trailing null byte. By spec, the null byte should
 |  | 
 | 
											
												
													
														|  | -        // always terminate the string. However, for safety, we do make an extra
 |  | 
 | 
											
												
													
														|  | -        // check.
 |  | 
 | 
											
												
													
														|  | -        let str_slice = if bytes.ends_with(&[b'\0']) {
 |  | 
 | 
											
												
													
														|  | -            let str_len = bytes.len() - 1;
 |  | 
 | 
											
												
													
														|  | -            &bytes[0..str_len]
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -            // Unlikely that a bootloader doesn't follow the spec and does not
 |  | 
 | 
											
												
													
														|  | -            // add a terminating null byte.
 |  | 
 | 
											
												
													
														|  | -            bytes
 |  | 
 | 
											
												
													
														|  | 
 |  | +            // Terminated case:
 | 
											
												
													
														|  | 
 |  | +            Some(idx) => idx,
 | 
											
												
													
														|  |          };
 |  |          };
 | 
											
												
													
														|  | -        core::str::from_utf8(str_slice)
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // Convert to Rust string:
 | 
											
												
													
														|  | 
 |  | +        core::str::from_utf8(&bytes[..length])
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -141,9 +134,11 @@ mod tests {
 | 
											
												
													
														|  |          // also unlikely case
 |  |          // also unlikely case
 | 
											
												
													
														|  |          assert_eq!(Ok(""), Tag::get_dst_str_slice(&[b'\0']));
 |  |          assert_eq!(Ok(""), Tag::get_dst_str_slice(&[b'\0']));
 | 
											
												
													
														|  |          // unlikely case: missing null byte. but the lib can cope with that
 |  |          // unlikely case: missing null byte. but the lib can cope with that
 | 
											
												
													
														|  | -        assert_eq!(Ok("foobar"), Tag::get_dst_str_slice("foobar".as_bytes()));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        assert_eq!(Ok("foobar"), Tag::get_dst_str_slice(b"foobar"));
 | 
											
												
													
														|  |          // test that the null bytes is not included in the string slice
 |  |          // test that the null bytes is not included in the string slice
 | 
											
												
													
														|  | -        assert_eq!(Ok("foobar"), Tag::get_dst_str_slice("foobar\0".as_bytes()));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        assert_eq!(Ok("foobar"), Tag::get_dst_str_slice(b"foobar\0"));
 | 
											
												
													
														|  | 
 |  | +        // test that C-style null string termination works as expected
 | 
											
												
													
														|  | 
 |  | +        assert_eq!(Ok("foo"), Tag::get_dst_str_slice(b"foo\0bar"));
 | 
											
												
													
														|  |          // test invalid utf8
 |  |          // test invalid utf8
 | 
											
												
													
														|  |          assert!(matches!(
 |  |          assert!(matches!(
 | 
											
												
													
														|  |              Tag::get_dst_str_slice(&[0xff, 0xff]),
 |  |              Tag::get_dst_str_slice(&[0xff, 0xff]),
 |