From patchwork Sun Sep 12 18:40:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 1526995 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=Rfw5i1aa; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4H6z2b6vB4z9sVw for ; Mon, 13 Sep 2021 04:40:54 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 900403858036 for ; Sun, 12 Sep 2021 18:40:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 900403858036 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1631472052; bh=13L8P2WXsJecFy7XWmqb7YL6lNukvIXr5Z4Z2PoYMSg=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Rfw5i1aayKjawklsecN1bjbsFdK9TnUjYxzXWPrjKGadXKa2++JBv8kDHKjAE9Z3A ZHRWI6bo2d7ANJAjkZCZn29gvTw1ThnosZGj8dsT2y+B9yy2eeDO3JYDW3/OYoOPhR XvNAvuBk5qrkkAg0hoyEiai39DoD4kR3uA318dvY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by sourceware.org (Postfix) with ESMTPS id 029E93858D34; Sun, 12 Sep 2021 18:40:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 029E93858D34 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.232.156.230] ([79.232.156.230]) by web-mail.gmx.net (3c-app-gmx-bs61.server.lan [172.19.170.145]) (via HTTP); Sun, 12 Sep 2021 20:40:14 +0200 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] PR fortran/85130 - Handling of substring range Date: Sun, 12 Sep 2021 20:40:14 +0200 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:NeM1kXoMjSk3ajZUvs8TPHiwCWb1/+CTtH7LA8jS6gLJr+Pns3dMsIUH5LsmmaWLtOObI tOsPogrxugmI5bB8Su1danmSlJIXxeoFlo2X86OnREVVE3CQQup97pcnRhBJqw/MUyII7fmoTdZv sczDVHNvCCsKjOfopxsAclxnO6MlS7eFWSttwvQV47hS37P6oa9p7Q55YejEPL5uNBPcDROPsTp5 0XUVBVCdpG7GjP2Jsl7dpBLFlvYXyX7dQXAmV2hWHADUpFUzZWNm4WRP25ootTYIcDinERuhw8KJ rk= X-UI-Out-Filterresults: notjunk:1;V03:K0:edRDebO6nvQ=:PUply2MRDvN0BisVBDF9hy 9KlxWj/k/Ck1bpB0uQ9/HZSJ5NbtSh7nWZ+h4quCcH68N1sFRZYucjtIQI37EpGcH2gBkTUpW SfxdEDl/PTCnjSnL2sZ96WJjCBYuSp4ixg1FjStHAzLfMvxzT7n3z/4Fq3Cnfcbc5nlz0Mel1 5h0zAeaZQgMieQwi4TJUHfNXLZ+CuTxYv0cXm+rgxH8l8Hm/e7EiF3HY/j2ZXWQrHnoINtXnO SsTIqqKAQYjJLI0VU0/P4+KTe06kPt/NaiRrwkFI7PW+SSeKPMFi8y+6T4uUohPRwjXQRlSOZ HQ0FzIu1P3vCTilKA7YP99e+Bo2/zcJkl5lu6DVwu7jRxeg0bO7QI+rHnMKtjr8aLpUJq6Jgy rlCFaDwGtpH2Rd9/lugH4YCZQ3PCr9MWP77TeyWJQPUl9kbtrimH2qwUffdj1XsS8zVMzE1WC 1CjxVkWO3bDnIebYmvO7GpSFKhPwj36aXrTgtsp77nHLPZX5OUGvBrDVkGaW1HOLqs+Rcploc lvT5sPlD/bkBo3pUa5CiocKCfFkOtr0eYjoN11jqAFm2jpHodEPC7fYWwNRWdUolTSs7N6NrN 9omTHiTH8WA0iwgBS9dPUYeRLTqCkWWF2a2Cemp6Y70U3unK78ZSwrev04Kkf3OwHmuTw0F08 lz4tYCtuWATgEOG9HRNN4bKbWvzTOLQo0cYRjtjntNwI0zNmeXce3/c1RpcwCjIPvTU2rWtU+ P6rPegObEei+253WDVxSLOoPeHdxV0W05NNatwynA0Si7y4HDTVbtWfBHgl5dCmucufxEkqjv 22JHIGd X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Harald Anlauf via Gcc-patches From: Harald Anlauf Reply-To: Harald Anlauf Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Dear all, in find_substring_ref we erroneously handled given substring start and end indices as unsigned integers. However, gives indices could be negative, which is legal as long as end < start, leading to a string of length zero. The current behavior could lead to a wrong length as well as an invalid read from (compiler) memory. The fix allows to reintroduce code in testcase substr_6.f90 that was erroneously considered as illegal. Regtested on x86_64-pc-linux-gnu. OK for mainline? As this is invalid code, I'd like to backport this fix. Thanks, Harald Fortran - fix handling of substring start and end indices gcc/fortran/ChangeLog: PR fortran/85130 * expr.c (find_substring_ref): Handle given substring start and end indices as signed integers, not unsigned. gcc/testsuite/ChangeLog: PR fortran/85130 * gfortran.dg/substr_6.f90: Revert commit r8-7574, adding again test that was erroneously considered as illegal. diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index dfecc3012e1..604e63e6164 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1724,8 +1724,8 @@ find_substring_ref (gfc_expr *p, gfc_expr **newp) *newp = gfc_copy_expr (p); free ((*newp)->value.character.string); - end = (gfc_charlen_t) mpz_get_ui (p->ref->u.ss.end->value.integer); - start = (gfc_charlen_t) mpz_get_ui (p->ref->u.ss.start->value.integer); + end = (gfc_charlen_t) mpz_get_si (p->ref->u.ss.end->value.integer); + start = (gfc_charlen_t) mpz_get_si (p->ref->u.ss.start->value.integer); if (end >= start) length = end - start + 1; else diff --git a/gcc/testsuite/gfortran.dg/substr_6.f90 b/gcc/testsuite/gfortran.dg/substr_6.f90 index 0d5e3d75e88..83e788a55a6 100644 --- a/gcc/testsuite/gfortran.dg/substr_6.f90 +++ b/gcc/testsuite/gfortran.dg/substr_6.f90 @@ -6,6 +6,8 @@ CHARACTER(5), parameter :: c0(1) = (/ "123" // ACHAR(0) // "5" /) CHARACTER*5 c(1) CHARACTER(1), parameter :: c1(5) = (/ "1", "2", "3", ACHAR(0), "5" /) +c = c0(1)(-5:-8) +if (c(1) /= " ") STOP 1 c = (/ c0(1)(1:5) /) do i=1,5 if (c(1)(i:i) /= c1(i)) STOP 2