Skip to content

Commit 486cba1

Browse files
sublipriSerial-ATA
authored andcommitted
ID3v2: Trim trailing nulls in some frames' content
1 parent 0cd16bd commit 486cba1

File tree

5 files changed

+15
-8
lines changed

5 files changed

+15
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
### Changed
1313
- **VorbisComments**: When converting from `Tag` to `VorbisComments`, `ItemKey::Unknown`s will be checked for spec compliance. ([PR](https://github.com/Serial-ATA/lofty-rs/pull/272))
14+
- **ID3v2**: Any trailing null terminators will be trimmed when reading Comment, Text, UserText, UserUrl, and UnsynchronizedText frames. ([PR](https://github.com/Serial-ATA/lofty-rs/pull/275))
1415
- **Alloc**: The default allocation limit for any single tag item is now **16MB**. ([PR](https://github.com/Serial-ATA/lofty-rs/pull/276))
1516
- **Probe**: `Probe::set_file_type()` will return the `Probe` to allow for builder-style usage. ([PR](https://github.com/Serial-ATA/lofty-rs/pull/276))
1617

src/id3/v2/items/extended_text_frame.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use crate::error::{Id3v2Error, Id3v2ErrorKind, LoftyError, Result};
22
use crate::id3::v2::frame::content::verify_encoding;
33
use crate::id3::v2::header::Id3v2Version;
4-
use crate::util::text::{decode_text, encode_text, read_to_terminator, utf16_decode, TextEncoding};
4+
use crate::util::text::{
5+
decode_text, encode_text, read_to_terminator, trim_end_nulls, utf16_decode, TextEncoding,
6+
};
57

68
use std::hash::{Hash, Hasher};
79
use std::io::Read;
@@ -59,9 +61,10 @@ impl ExtendedTextFrame {
5961
let encoding = verify_encoding(encoding_byte, version)?;
6062
let description = decode_text(reader, encoding, true)?;
6163

62-
let frame_content;
64+
let mut frame_content;
6365
if encoding != TextEncoding::UTF16 {
6466
frame_content = decode_text(reader, encoding, false)?.content;
67+
trim_end_nulls(&mut frame_content);
6568

6669
return Ok(Some(ExtendedTextFrame {
6770
encoding,

src/id3/v2/items/extended_url_frame.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::error::Result;
22
use crate::id3::v2::frame::content::verify_encoding;
33
use crate::id3::v2::header::Id3v2Version;
4-
use crate::util::text::{decode_text, encode_text, TextEncoding};
4+
use crate::util::text::{decode_text, encode_text, trim_end_nulls, TextEncoding};
55

66
use std::hash::{Hash, Hasher};
77
use std::io::Read;
@@ -58,7 +58,8 @@ impl ExtendedUrlFrame {
5858

5959
let encoding = verify_encoding(encoding_byte, version)?;
6060
let description = decode_text(reader, encoding, true)?.content;
61-
let content = decode_text(reader, TextEncoding::Latin1, false)?.content;
61+
let mut content = decode_text(reader, TextEncoding::Latin1, false)?.content;
62+
trim_end_nulls(&mut content);
6263

6364
Ok(Some(ExtendedUrlFrame {
6465
encoding,

src/id3/v2/items/language_frame.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::error::{Id3v2Error, Id3v2ErrorKind, Result};
22
use crate::id3::v2::frame::content::verify_encoding;
33
use crate::id3::v2::header::Id3v2Version;
4-
use crate::util::text::{decode_text, encode_text, TextEncoding};
4+
use crate::util::text::{decode_text, encode_text, trim_end_nulls, TextEncoding};
55

66
use std::hash::{Hash, Hasher};
77
use std::io::Read;
@@ -33,7 +33,8 @@ impl LanguageFrame {
3333
reader.read_exact(&mut language)?;
3434

3535
let description = decode_text(reader, encoding, true)?.content;
36-
let content = decode_text(reader, encoding, false)?.content;
36+
let mut content = decode_text(reader, encoding, false)?.content;
37+
trim_end_nulls(&mut content);
3738

3839
Ok(Some(Self {
3940
encoding,

src/id3/v2/items/text_information_frame.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::error::Result;
22
use crate::id3::v2::frame::content::verify_encoding;
33
use crate::id3::v2::header::Id3v2Version;
4-
use crate::util::text::{decode_text, encode_text, TextEncoding};
4+
use crate::util::text::{decode_text, encode_text, trim_end_nulls, TextEncoding};
55

66
use byteorder::ReadBytesExt;
77

@@ -37,7 +37,8 @@ impl TextInformationFrame {
3737
};
3838

3939
let encoding = verify_encoding(encoding_byte, version)?;
40-
let value = decode_text(reader, encoding, false)?.content;
40+
let mut value = decode_text(reader, encoding, false)?.content;
41+
trim_end_nulls(&mut value);
4142

4243
Ok(Some(TextInformationFrame { encoding, value }))
4344
}

0 commit comments

Comments
 (0)