From: Jaroslav Kysela Date: Thu, 21 Nov 2019 23:57:19 +0000 (+0100) Subject: pcm_file: fix pipe stall when pclose() is called too early X-Git-Tag: v1.2.1.2~15 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=193ed64fd99110aebd74e2388c6d44f90f4e3d5b;p=alsa-lib.git pcm_file: fix pipe stall when pclose() is called too early BugLink: https://github.com/alsa-project/alsa-lib/issues/14 Signed-off-by: Jaroslav Kysela --- diff --git a/src/pcm/pcm_file.c b/src/pcm/pcm_file.c index da7f087b..a02b2dc0 100644 --- a/src/pcm/pcm_file.c +++ b/src/pcm/pcm_file.c @@ -71,6 +71,7 @@ typedef struct { int trunc; int perm; int fd; + FILE *pipe; char *ifname; int ifd; int format; @@ -227,15 +228,10 @@ static int snd_pcm_file_open_output_file(snd_pcm_file_t *file) file->final_fname); return -errno; } - fd = dup(fileno(pipe)); - err = -errno; - pclose(pipe); - if (fd < 0) { - SYSERR("unable to dup pipe file handle for command %s", - file->final_fname); - return err; - } + fd = fileno(pipe); + file->pipe = pipe; } else { + file->pipe = NULL; if (file->trunc) fd = open(file->final_fname, O_WRONLY|O_CREAT|O_TRUNC, file->perm); @@ -486,7 +482,9 @@ static int snd_pcm_file_close(snd_pcm_t *pcm) if (file->wav_header.fmt) fixup_wav_header(pcm); free((void *)file->fname); - if (file->fd >= 0) { + if (file->pipe) { + pclose(file->pipe); + } else if (file->fd >= 0) { close(file->fd); } }