From patchwork Sat Aug 29 05:18:11 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerry DeLisle X-Patchwork-Id: 512114 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 9C5151401DE for ; Sat, 29 Aug 2015 15:18:24 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=jpHXzZzc; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=GUbVHgwmPkPlBjyqwD+4a6Nh9cz6uv69BPKyWrrEzHjAW3wJnM HsHAk+rKjhuxqqPfvy2k0ec9IkEC8Qlg8pd8WCw44HUzHV+iMnK9F2rscXxDbOs+ Y2hG4XdpE1Tb3nzkpwdM3SZXJI43fPuTNmOzb5q2uY/q+IOLoH0GSEFJc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=VR9IgTsnNgzPWlFyT70FYN9v144=; b=jpHXzZzc4TS4yI59dEpu GZy72nF+Dv4Ny7w9Pv6J9U+w1ShZPLPYIUcV8shUCs3SSMa7EUoRCETor/kxcctQ 8ixG9x54TrIOLZVCKmxiG45OlQKhJ3CiJjzsLoOYTrQovRQW1hc1eyWZVUTvpW04 D3dNRFsUTfQorSycTS32d+8= Received: (qmail 1635 invoked by alias); 29 Aug 2015 05:18:18 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 1615 invoked by uid 89); 29 Aug 2015 05:18:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mta21.charter.net Received: from mta21.charter.net (HELO mta21.charter.net) (216.33.127.81) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 29 Aug 2015 05:18:16 +0000 Received: from imp10 ([10.20.200.15]) by mta21.charter.net (InterMail vM.8.01.05.09 201-2260-151-124-20120717) with ESMTP id <20150829051814.ZEQC23400.mta21.charter.net@imp10>; Sat, 29 Aug 2015 01:18:14 -0400 Received: from mtaout004.msg.strl.va.charter.net ([68.114.190.29]) by imp10 with smtp.charter.net id AVJE1r0050eWGlw05VJEfj; Sat, 29 Aug 2015 01:18:14 -0400 Received: from impout001 ([68.114.189.16]) by mtaout004.msg.strl.va.charter.net (InterMail vM.9.00.020.01 201-2473-160) with ESMTP id <20150829051814.EWZN1440.mtaout004.msg.strl.va.charter.net@impout001>; Sat, 29 Aug 2015 00:18:14 -0500 Received: from quattro.localdomain ([96.41.215.23]) by impout001 with charter.net id AVJD1r0050Wrkg001VJDqE; Sat, 29 Aug 2015 00:18:14 -0500 X-Authority-Analysis: v=2.1 cv=R/mNGLhX c=1 sm=1 tr=0 a=salB9WdMPIDduBH7JsZfrA==:117 a=salB9WdMPIDduBH7JsZfrA==:17 a=hOpmn2quAAAA:8 a=r77TgQKjGQsHNAKrUKIA:9 a=mDV3o1hIAAAA:8 a=TcGFzQrOfU3_rPqh1QUA:9 a=T5f-xGRfFn_Ow7pt:21 a=cOaufQ2f-tNqM4oN:21 a=QEXdDO2ut3YA:10 a=w2O0QXrbyZD6CUTCSlYA:9 a=8GDvvN2iI2ch76BoRP4A:9 a=8IZu5ppF-yMA:10 X-Auth-id: anZkZWxpc2xlQGNoYXJ0ZXIubmV0 To: gfortran Cc: gcc patches From: Jerry DeLisle Subject: [patch, libgfortran] PR67367 Program crashes on READ X-Enigmail-Draft-Status: N1110 Message-ID: <55E14093.1070407@charter.net> Date: Fri, 28 Aug 2015 22:18:11 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 I found that in read_buf where raw_read is called, no checks for errors were being made, raw_read returns the number of bytes read or an error code. In the test case, an error occurs and we proceeded to use the resulting error code as if it were the number of bytes read. The attached patch fixes this. Regression tested on x86_64. New test case provided. OK for trunk? Regards, Jerry 2015-08-28 Jerry DeLisle PR libgfortran/67367 * io/unix.c (buf_read): Check for error condition and if found return the error code. Index: unix.c =================================================================== --- unix.c (revision 227314) +++ unix.c (working copy) @@ -529,16 +529,26 @@ buf_read (unix_stream * s, void * buf, ssize_t nby if (to_read <= BUFFER_SIZE/2) { did_read = raw_read (s, s->buffer, BUFFER_SIZE); - s->physical_offset += did_read; - s->active = did_read; - did_read = (did_read > to_read) ? to_read : did_read; - memcpy (p, s->buffer, did_read); + if (likely (did_read >= 0)) + { + s->physical_offset += did_read; + s->active = did_read; + did_read = (did_read > to_read) ? to_read : did_read; + memcpy (p, s->buffer, did_read); + } + else + return did_read; } else { did_read = raw_read (s, p, to_read); - s->physical_offset += did_read; - s->active = 0; + if (likely (did_read >= 0)) + { + s->physical_offset += did_read; + s->active = 0; + } + else + return did_read; } nbyte = did_read + nread; }