From patchwork Thu Nov 2 23:05:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "pcarroll@codesourcery.com" X-Patchwork-Id: 24061 Received: (qmail 72929 invoked by alias); 2 Nov 2017 23:05:31 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 72919 invoked by uid 89); 2 Nov 2017 23:05:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_50, FORGED_MUA_MOZILLA, GIT_PATCH_2, GIT_PATCH_3, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, URIBL_RED autolearn=ham version=3.3.2 spammy=H*x:WebService, H*x:Mozilla, H*x:Gecko, H*UA:WebService X-HELO: sonic307-18.consmr.mail.bf2.yahoo.com Received: from sonic307-18.consmr.mail.bf2.yahoo.com (HELO sonic307-18.consmr.mail.bf2.yahoo.com) (74.6.134.57) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 02 Nov 2017 23:05:29 +0000 Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.bf2.yahoo.com with HTTP; Thu, 2 Nov 2017 23:05:27 +0000 Date: Thu, 2 Nov 2017 23:05:23 +0000 (UTC) From: "pcarroll@codesourcery.com" To: "gdb-patches@sourceware.org" Message-ID: <1155839491.1748621.1509663923992@mail.yahoo.com> Subject: [PATCH] Assertion 'xfered>0' in target.c for remote connection MIME-Version: 1.0 References: <1155839491.1748621.1509663923992.ref@mail.yahoo.com> We have a customer who is using a Corelis gdb server to connect to gdb. Occasionally, the gdb server will send a 0-byte block of memory for a read. When this happens, gdb gives an assertion from target.c: internal-error: target_xfer_partial: Assertion `*xfered_len > 0' failed. This problem is almost identical to that fixed in https://sourceware.org/ml/gdb-patches/2014-02/msg00636.html In this case, remote.c needs to be modified to return TARGET_XFER_EOF instead of TARGET_XFER_OK or TARGET_XFER_UNAVAILABLE when 0 bytes are transferred. The proposed fix would be: diff -rup fsf/gdb/ChangeLog fix/gdb/ChangeLog --- fsf/gdb/ChangeLog   2017-11-02 16:13:19.188615000 -0500 +++ fix/gdb/ChangeLog   2017-11-02 16:13:21.626754500 -0500 @@ -1,3 +1,10 @@ +2017-11-02  Paul Carroll  + +       PR gdb/22388 +       * remote.c (remote_write_bytes_aux, remote_read_bytes_1, +       remote_read_bytes, remote_write_qxfer, remote_xfer_partial): +       Return TARGET_XFER_EOF if size of returned data is 0. + 2017-11-02  Yao Qi          * frame.c (do_frame_register_read): Remove aspace. diff -rup fsf/gdb/remote.c fix/gdb/remote.c --- fsf/gdb/remote.c    2017-11-02 16:06:15.979408800 -0500 +++ fix/gdb/remote.c    2017-11-02 15:24:35.536391700 -0500 @@ -8264,7 +8264,7 @@ remote_write_bytes_aux (const char *head    /* Return UNITS_WRITTEN, not TODO_UNITS, in case escape chars caused us to       send fewer units than we'd planned.  */    *xfered_len_units = (ULONGEST) units_written; -  return TARGET_XFER_OK; +  return (*xfered_len_units != 0) ? TARGET_XFER_OK : TARGET_XFER_EOF; } /* Write memory data directly to the remote machine. @@ -8358,7 +8358,7 @@ remote_read_bytes_1 (CORE_ADDR memaddr,    decoded_bytes = hex2bin (p, myaddr, todo_units * unit_size);    /* Return what we have.  Let higher layers handle partial reads.  */    *xfered_len_units = (ULONGEST) (decoded_bytes / unit_size); -  return TARGET_XFER_OK; +  return (*xfered_len_units != 0) ? TARGET_XFER_OK : TARGET_XFER_EOF; } /* Using the set of read-only target sections of remote, read live @@ -8455,13 +8455,14 @@ remote_read_bytes (struct target_ops *op               res = remote_xfer_live_readonly_partial (ops, myaddr, memaddr,                                                        len, unit_size, xfered_len);               if (res == TARGET_XFER_OK) -               return TARGET_XFER_OK; +               return (*xfered_len != 0) ? TARGET_XFER_OK : TARGET_XFER_EOF;               else                 {                   /* No use trying further, we know some memory starting                      at MEMADDR isn't available.  */                   *xfered_len = len; -                 return TARGET_XFER_UNAVAILABLE; +                 return (*xfered_len != 0) ? +                   TARGET_XFER_UNAVAILABLE : TARGET_XFER_EOF;                 }             } @@ -10386,7 +10387,7 @@ remote_write_qxfer (struct target_ops *o    unpack_varlen_hex (rs->buf, &n);    *xfered_len = n; -  return TARGET_XFER_OK; +  return (*xfered_len != 0) ? TARGET_XFER_OK : TARGET_XFER_EOF; } /* Read OBJECT_NAME/ANNEX from the remote target using a qXfer packet. @@ -10687,7 +10688,7 @@ remote_xfer_partial (struct target_ops *    strcpy ((char *) readbuf, rs->buf);    *xfered_len = strlen ((char *) readbuf); -  return TARGET_XFER_OK; +  return (*xfered_len != 0) ? TARGET_XFER_OK : TARGET_XFER_EOF; } /* Implementation of to_get_memory_xfer_limit.  */