Skip to content

Commit 12535dc

Browse files
committed
Fix metaflac --import-tags-from-file, allow missing newline and \r
Remove one extra feof() call since it would prevent the last line from being added if it was missing a newline at the end. Check for both \r and \n, since otherwise the tags will be added with an extra \r included in the tag value, which is unexpected. Fixes #856
1 parent afb801b commit 12535dc

File tree

2 files changed

+54
-22
lines changed

2 files changed

+54
-22
lines changed

src/metaflac/operations_shorthand_vorbiscomment.c

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -359,33 +359,39 @@ FLAC__bool import_vc_from(const char *filename, FLAC__StreamMetadata *block, con
359359

360360
ret = true;
361361
while(ret && !feof(f) && fgets(line, sizeof(line), f) != NULL) {
362-
if(!feof(f)) {
363-
char *p = strchr(line, '\n');
364-
if(0 == p) {
362+
char *p = strpbrk(line, "\r\n");
363+
if(0 == p) {
364+
const size_t len = strlen(line);
365+
if(len < (sizeof(line) - 1)) {
366+
/* Likely missing newline in the last line, allow this */
367+
p = &line[len];
368+
}
369+
else {
365370
flac_fprintf(stderr, "%s: ERROR: line too long, aborting\n", vc_filename->value);
366371
ret = false;
367372
}
373+
}
374+
375+
if(ret) {
376+
const char *violation;
377+
Argument_VcField field;
378+
*p = '\0';
379+
memset(&field, 0, sizeof(Argument_VcField));
380+
field.field_value_from_file = false;
381+
if(!parse_vorbis_comment_field(line, &field.field, &field.field_name, &field.field_value, &field.field_value_length, &violation)) {
382+
FLAC__ASSERT(0 != violation);
383+
flac_fprintf(stderr, "%s: ERROR: malformed vorbis comment field \"%s\",\n %s\n", vc_filename->value, line, violation);
384+
ret = false;
385+
}
368386
else {
369-
const char *violation;
370-
Argument_VcField field;
371-
*p = '\0';
372-
memset(&field, 0, sizeof(Argument_VcField));
373-
field.field_value_from_file = false;
374-
if(!parse_vorbis_comment_field(line, &field.field, &field.field_name, &field.field_value, &field.field_value_length, &violation)) {
375-
FLAC__ASSERT(0 != violation);
376-
flac_fprintf(stderr, "%s: ERROR: malformed vorbis comment field \"%s\",\n %s\n", vc_filename->value, line, violation);
377-
ret = false;
378-
}
379-
else {
380-
ret = set_vc_field(filename, block, &field, needs_write, raw);
381-
}
382-
if(0 != field.field)
383-
free(field.field);
384-
if(0 != field.field_name)
385-
free(field.field_name);
386-
if(0 != field.field_value)
387-
free(field.field_value);
387+
ret = set_vc_field(filename, block, &field, needs_write, raw);
388388
}
389+
if(0 != field.field)
390+
free(field.field);
391+
if(0 != field.field_name)
392+
free(field.field_name);
393+
if(0 != field.field_value)
394+
free(field.field_value);
389395
}
390396
};
391397

test/test_metaflac.sh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,18 @@ echo "TITLE=Tittle" | run_metaflac --import-tags-from=- $flacfile
354354
check_flac
355355
metaflac_test case39 "--import-tags-from=-" "--list"
356356

357+
# Run same test again, but with \r\n newline:
358+
run_metaflac --remove-all-tags --set-tag="f=0123456789abcdefghij" $flacfile
359+
printf 'TITLE=Tittle\r\n' | run_metaflac --import-tags-from=- $flacfile
360+
check_flac
361+
metaflac_test case39 "--import-tags-from=-" "--list"
362+
363+
# Run same test again, but without newline at the end:
364+
run_metaflac --remove-all-tags --set-tag="f=0123456789abcdefghij" $flacfile
365+
echo -n "TITLE=Tittle" | run_metaflac --import-tags-from=- $flacfile
366+
check_flac
367+
metaflac_test case39 "--import-tags-from=-" "--list"
368+
357369
cat > vc.txt << EOF
358370
artist=Fartist
359371
artist=artits
@@ -362,6 +374,20 @@ run_metaflac --import-tags-from=vc.txt $flacfile
362374
check_flac
363375
metaflac_test case40 "--import-tags-from=[FILE]" "--list"
364376

377+
# Run same test again, but with \r\n newlines:
378+
printf 'artist=Fartist\r\nartist=artits\r\n' >vc.txt
379+
run_metaflac --remove-all-tags --set-tag="f=0123456789abcdefghij" --set-tag="TITLE=Tittle" $flacfile
380+
run_metaflac --import-tags-from=vc.txt $flacfile
381+
check_flac
382+
metaflac_test case40 "--import-tags-from=[FILE]" "--list"
383+
384+
# Run same test again, but without newline at the end:
385+
printf 'artist=Fartist\nartist=artits' >vc.txt
386+
run_metaflac --remove-all-tags --set-tag="f=0123456789abcdefghij" --set-tag="TITLE=Tittle" $flacfile
387+
run_metaflac --import-tags-from=vc.txt $flacfile
388+
check_flac
389+
metaflac_test case40 "--import-tags-from=[FILE]" "--list"
390+
365391
rm vc.txt
366392

367393
run_metaflac --add-replay-gain $flacfile

0 commit comments

Comments
 (0)