The following CD-TEXT would fail when parsing due to an off-by-one in the composer data type because the album-level composer field is empty:
80 0 0 0 41 20 4d 65 6d 6f 69 72 20 6f 66 20 5f 23 80 0 1 c 46 72 65 65 20 57 69 6c 6c 0 47 6f 5b 8d 80 1 2 2 6e 65 20 42 75 74 20 4e 6f 74 20 46 b0 df 80 1 3 e 6f 72 67 6f 74 74 65 6e 0 49 6e 73 9 18 80 2 4 3 61 6e 69 74 79 20 41 20 4d 6f 6e 69 49 27 80 2 5 f 6b 65 72 20 4f 66 20 4d 65 0 54 6f 13 d2 80 3 6 2 20 50 65 72 73 69 73 74 20 6f 72 20 3b 87 80 3 7 e 41 64 68 65 72 65 0 41 6e 20 45 6c 63 87 80 4 8 5 65 67 79 20 66 6f 72 20 61 20 4d 61 bc e6 80 4 9 f 6e 20 41 6c 69 76 65 0 50 73 79 63 93 89 80 5 a 4 68 6f 74 69 63 6c 79 73 6d 0 41 6e d6 a 80 6 b 2 20 49 6e 74 72 61 6d 75 72 61 6c 20 aa b6 80 6 c e 4d 61 64 6e 65 73 73 0 51 75 65 73 b8 0 80 7 d 4 74 69 6f 6e 73 20 6f 66 20 61 20 48 60 11 80 7 e f 6f 6c 69 73 74 69 63 20 44 69 76 69 bb b8 80 7 f f 6e 65 0 57 69 74 68 20 56 69 72 74 60 f5 80 8 10 9 75 65 20 49 20 41 6d 20 46 72 65 65 21 6 80 8 11 f 0 42 61 74 74 6c 65 73 20 41 72 65 a5 b9 80 9 12 b 20 57 6f 6e 20 57 69 74 68 69 6e 0 b0 f3 80 a 13 0 41 20 4d 65 6d 69 6f 72 20 6f 66 20 52 2f 80 a 14 c 46 72 65 65 20 57 69 6c 6c 0 0 0 78 30 81 0 15 0 4b 72 6f 73 69 73 0 4b 72 6f 73 69 91 f1 81 1 16 5 73 0 9 0 9 0 9 0 9 0 9 0 80 2d 81 7 17 0 9 0 9 0 9 0 9 0 0 0 0 0 bd f4 82 0 18 0 0 4b 72 6f 73 69 73 0 9 0 9 0 47 9c ^^^ 82 4 19 0 9 0 9 0 9 0 9 0 9 0 9 0 1f 7f 82 a 1a 0 9 0 0 0 0 0 0 0 0 0 0 0 1e f8 83 0 1b 0 0 4b 72 6f 73 69 73 0 9 0 9 0 62 1b 83 4 1c 0 9 0 9 0 9 0 9 0 9 0 9 0 31 9f 83 a 1d 0 9 0 0 0 0 0 0 0 0 0 0 0 c6 da 84 0 1e 0 0 4b 72 6f 73 69 73 0 9 0 9 0 8c 40 84 4 1f 0 9 0 9 0 9 0 9 0 9 0 9 0 d4 a3 84 a 20 0 9 0 0 0 0 0 0 0 0 0 0 0 98 d2 8e 0 21 0 0 51 4d 37 32 38 31 39 30 35 32 30 2c cb 8e 1 22 b 34 0 51 4d 37 32 38 31 39 30 35 32 31 28 8e 2 23 a 30 35 0 51 4d 37 32 38 31 39 30 35 1a 5c 8e 3 24 9 32 30 36 0 51 4d 37 32 38 31 39 30 53 af 8e 4 25 8 35 32 30 37 0 51 4d 37 32 38 31 39 6c 0 8e 5 26 7 30 35 32 30 38 0 51 4d 37 32 38 31 c6 9b 8e 6 27 6 39 30 35 32 30 39 0 51 4d 37 32 38 39 e0 8e 7 28 5 31 39 30 35 32 31 30 0 51 4d 37 32 48 67 8e 8 29 4 38 31 39 30 35 32 31 31 0 51 4d 37 bf 19 8e 9 2a 3 32 38 31 39 30 35 32 31 32 0 51 4d 17 fa 8e a 2b 2 37 32 38 31 39 30 35 32 31 33 0 0 6f 43 8f 0 2c 0 0 1 a 0 15 3 3 3 3 0 0 0 5f 7b 8f 1 2d 0 0 0 0 0 0 0 b 3 2e 0 0 0 68 6c 8f 2 2e 0 0 0 0 0 9 0 0 0 0 0 0 0 e7 87 With the album-level field empty cur_track was never incremented, causing an off-by-one. Since the CD-TEXT additionally makes use of the Tab Indicator the entire CD-TEXT is thrown out as invalid due to a tab found in track 1 (that should be track 2). Fix this by always incrementing cur_track on a termination, even if the buffer contains nothing. Since this may cause cur_track to go beyond the last track of the CD setting the CD-TEXT fields is now guarded by the total track count. --- Hi, Please note I did not subscribe to the list, please explicitly include me in responses. Thanks! --- lib/driver/cdtext.c | 68 +++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/lib/driver/cdtext.c b/lib/driver/cdtext.c index a80d5974..85af1836 100644 --- a/lib/driver/cdtext.c +++ b/lib/driver/cdtext.c @@ -799,7 +799,7 @@ cdtext_data_init(cdtext_t *p_cdtext, uint8_t *wdata, size_t i_data) buffer[i_buf++] = pack.text[j]; if(pack.db_chars) buffer[i_buf++] = pack.text[j+1]; - } else if(i_buf > 0) { + } else { /* if end of string */ /* check if the buffer contains only the Tab Indicator */ @@ -815,38 +815,40 @@ cdtext_data_init(cdtext_t *p_cdtext, uint8_t *wdata, size_t i_data) buffer[i_buf++] = 0; } - switch (pack.type) { - case CDTEXT_PACK_TITLE: - cdtext_set(p_cdtext, CDTEXT_FIELD_TITLE, buffer, cur_track, charset); - break; - case CDTEXT_PACK_PERFORMER: - cdtext_set(p_cdtext, CDTEXT_FIELD_PERFORMER, buffer, cur_track, charset); - break; - case CDTEXT_PACK_SONGWRITER: - cdtext_set(p_cdtext, CDTEXT_FIELD_SONGWRITER, buffer, cur_track, charset); - break; - case CDTEXT_PACK_COMPOSER: - cdtext_set(p_cdtext, CDTEXT_FIELD_COMPOSER, buffer, cur_track, charset); - break; - case CDTEXT_PACK_ARRANGER: - cdtext_set(p_cdtext, CDTEXT_FIELD_ARRANGER, buffer, cur_track, charset); - break; - case CDTEXT_PACK_MESSAGE: - cdtext_set(p_cdtext, CDTEXT_FIELD_MESSAGE, buffer, cur_track, charset); - break; - case CDTEXT_PACK_DISCID: - if (cur_track == 0) - cdtext_set(p_cdtext, CDTEXT_FIELD_DISCID, buffer, cur_track, NULL); - break; - case CDTEXT_PACK_GENRE: - cdtext_set(p_cdtext, CDTEXT_FIELD_GENRE, buffer, cur_track, "ASCII"); - break; - case CDTEXT_PACK_UPC: - if (cur_track == 0) - cdtext_set(p_cdtext, CDTEXT_FIELD_UPC_EAN, buffer, cur_track, "ASCII"); - else - cdtext_set(p_cdtext, CDTEXT_FIELD_ISRC, buffer, cur_track, "ISO-8859-1"); - break; + if ( cur_track <= blocksize.i_last_track ) { + switch (pack.type) { + case CDTEXT_PACK_TITLE: + cdtext_set(p_cdtext, CDTEXT_FIELD_TITLE, buffer, cur_track, charset); + break; + case CDTEXT_PACK_PERFORMER: + cdtext_set(p_cdtext, CDTEXT_FIELD_PERFORMER, buffer, cur_track, charset); + break; + case CDTEXT_PACK_SONGWRITER: + cdtext_set(p_cdtext, CDTEXT_FIELD_SONGWRITER, buffer, cur_track, charset); + break; + case CDTEXT_PACK_COMPOSER: + cdtext_set(p_cdtext, CDTEXT_FIELD_COMPOSER, buffer, cur_track, charset); + break; + case CDTEXT_PACK_ARRANGER: + cdtext_set(p_cdtext, CDTEXT_FIELD_ARRANGER, buffer, cur_track, charset); + break; + case CDTEXT_PACK_MESSAGE: + cdtext_set(p_cdtext, CDTEXT_FIELD_MESSAGE, buffer, cur_track, charset); + break; + case CDTEXT_PACK_DISCID: + if (cur_track == 0) + cdtext_set(p_cdtext, CDTEXT_FIELD_DISCID, buffer, cur_track, NULL); + break; + case CDTEXT_PACK_GENRE: + cdtext_set(p_cdtext, CDTEXT_FIELD_GENRE, buffer, cur_track, "ASCII"); + break; + case CDTEXT_PACK_UPC: + if (cur_track == 0) + cdtext_set(p_cdtext, CDTEXT_FIELD_UPC_EAN, buffer, cur_track, "ASCII"); + else + cdtext_set(p_cdtext, CDTEXT_FIELD_ISRC, buffer, cur_track, "ISO-8859-1"); + break; + } } i_buf = 0; ++cur_track; -- 2.45.1