From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7868) id 464293858425; Wed, 25 Jan 2023 17:08:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 464293858425 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1674666518; bh=QE1kfrQOlAnVJpigAT4weZ26BSYJeoigxJju08Px7E8=; h=From:To:Subject:Date:From; b=HMDa4OsAhnMRYbmSWIP/Ij1y6h907YiXkPqlWDz92sd+kLhPDw7M0eeWXhCqIo8Zf Uzp1ir57Lvx0rt+k7uN7BpLa9n5ryFU/5ECQVhoV/Uv4o+9wrP+7qn4r9G51DtjDrb sCQBXHo1gAvyXVsg4lMuQXu4+CNEFdhxKDhOxRxA= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Takashi Yano To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: dsp: Fix hang on close() if another thread calls write(). X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: cad3913ed8b1ce5db9396edc2f9e461cdb10998b X-Git-Newrev: bf915420042eadf29622c9a7b7ab12221f238fe5 Message-Id: <20230125170838.464293858425@sourceware.org> Date: Wed, 25 Jan 2023 17:08:38 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3Dbf915420042= eadf29622c9a7b7ab12221f238fe5 commit bf915420042eadf29622c9a7b7ab12221f238fe5 Author: Takashi Yano Date: Wed Jan 25 18:30:50 2023 +0900 Cygwin: dsp: Fix hang on close() if another thread calls write(). =20 fhandler_dev_dsp (OSS) has a problem that waitforallsent(), which is called from close(), falls into infinite loop if another thread calls write() accidentally after close(). This patch fixes the issue. =20 Reviewed-by: Corinna Vinschen Signed-off-by: Takashi Yano Diff: --- winsup/cygwin/fhandler/dsp.cc | 9 +++++++++ winsup/cygwin/local_includes/fhandler.h | 1 + 2 files changed, 10 insertions(+) diff --git a/winsup/cygwin/fhandler/dsp.cc b/winsup/cygwin/fhandler/dsp.cc index 8798cf876..cfbf6bec7 100644 --- a/winsup/cygwin/fhandler/dsp.cc +++ b/winsup/cygwin/fhandler/dsp.cc @@ -1093,6 +1093,8 @@ fhandler_dev_dsp::open (int flags, mode_t) =20 debug_printf ("ACCMODE=3D%y audio_in=3D%d audio_out=3D%d, err=3D%d, ret= =3D%d", flags & O_ACCMODE, num_in, num_out, err, ret); + if (ret) + being_closed =3D false; return ret; } =20 @@ -1106,6 +1108,12 @@ fhandler_dev_dsp::_write (const void *ptr, size_t le= n) int len_s =3D len; const char *ptr_s =3D static_cast (ptr); =20 + if (being_closed) + { + set_errno (EBADF); + return -1; + } + if (audio_out_) /* nothing to do */; else if (IS_WRITE ()) @@ -1207,6 +1215,7 @@ int fhandler_dev_dsp::close () { debug_printf ("audio_in=3D%p audio_out=3D%p", audio_in_, audio_out_); + being_closed =3D true; close_audio_in (); close_audio_out (); return fhandler_base::close (); diff --git a/winsup/cygwin/local_includes/fhandler.h b/winsup/cygwin/local_= includes/fhandler.h index 113e40293..f3dd1b5a4 100644 --- a/winsup/cygwin/local_includes/fhandler.h +++ b/winsup/cygwin/local_includes/fhandler.h @@ -2762,6 +2762,7 @@ class fhandler_dev_dsp: public fhandler_base int audiochannels_; Audio_out *audio_out_; Audio_in *audio_in_; + bool being_closed; public: fhandler_dev_dsp (); fhandler_dev_dsp *base () const {return (fhandler_dev_dsp *)archetype;}