X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Thu, 13 Aug 2009 16:15:20 -0400 From: Christopher Faylor To: cygwin AT cygwin DOT com Subject: Re: Cygwin1.dll 1.7.0-5x: RSYNC failures in close() system call on pipe file descriptors Message-ID: <20090813201520.GA4365@ednor.casa.cgf.cx> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <4A844A97 DOT 1050809 AT sipxx DOT com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Thu, Aug 13, 2009 at 07:52:01PM +0000, Eric Blake wrote: >cygwin sipxx.com> writes: > >> >> - if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || >> - close(to_child_pipe[1]) < 0 || >> - close(from_child_pipe[0]) < 0 || >> - dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { >> - rsyserr(FERROR, errno, "Failed to dup/close"); >> + if (dup2(to_child_pipe[0], STDIN_FILENO) < 0) { >> + rsyserr(FERROR, errno, "Failed to dup2(to-0)"); >> exit_cleanup(RERR_IPC); >> } >> - if (to_child_pipe[0] != STDIN_FILENO) >> - close(to_child_pipe[0]); >> - if (from_child_pipe[1] != STDOUT_FILENO) >> - close(from_child_pipe[1]); > >Ouch. rsync has a bug even without your patch: if you run rsync with >stdout closed (as opposed to redirected), then to_child_pipe[0] can be >1, and you end up closing the just-duplicated from_child_pipe[1] that >was copied to the new stdout. To be correct, rsync must compare >to_child_pipe[0] against both 0 and 1, not just 0 (likewise for >from_child_pipe[1] against both 0 and 1, not just 1). Amazing how >often this type of bug reappears, too - historical cygwin has had it in >the past with newlib's popen implementation (I fixed it 2006-08-22), as >well as m4 1.4.13-1 having it due to code from gnulib (I fixed it >2009-07- 17). Just a point of order: Cygwin doesn't use the newlib version of popen. cgf -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple