aplay: fix lurking capture file overwrite bug

If -d was given to arecord while commit
8aa13eec80 (now reverted) was in effect,
the last read would be shorter than the chunk size, but pcm_read would
read and return the chunk size, the samples were discarded, and
capture() continued in a loop because count never reached 0.  arecord
opens a new file each loop iteration, if arecord is dynamically naming
files, --use-strftime option or beyond the wave 2GB limit, this will
generate a series of header only wave files.  If the file is unique
the originally recorded data is lost and it will continue overwriting
the same file with a header only wave file.

While the current pcm_read can't fail (it can exit), it is better to
just fix this lurking bug in case it is "fixed" again.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
David Fries 2016-04-13 23:32:46 -05:00 committed by Takashi Iwai
parent 96db90e98a
commit 85827fbb64

View file

@ -3067,11 +3067,14 @@ static void capture(char *orig_name)
size_t c = (rest <= (off64_t)chunk_bytes) ?
(size_t)rest : chunk_bytes;
size_t f = c * 8 / bits_per_frame;
if (pcm_read(audiobuf, f) != f)
if (pcm_read(audiobuf, f) != f) {
in_aborting = 1;
break;
}
if (write(fd, audiobuf, c) != c) {
perror(name);
prg_exit(EXIT_FAILURE);
in_aborting = 1;
break;
}
count -= c;
rest -= c;
@ -3091,7 +3094,7 @@ static void capture(char *orig_name)
}
if (in_aborting)
break;
prg_exit(EXIT_FAILURE);
/* repeat the loop when format is raw without timelimit or
* requested counts of data are recorded