From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by sourceware.org (Postfix) with ESMTPS id ADDE0385800C; Sun, 24 Jan 2021 21:12:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org ADDE0385800C X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.232.144.26] ([79.232.144.26]) by web-mail.gmx.net (3c-app-gmx-bap45.server.lan [172.19.172.115]) (via HTTP); Sun, 24 Jan 2021 22:12:00 +0100 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] PR fortran/70070 - ICE on initializing character data beyond min/max bound Content-Type: multipart/mixed; boundary=refeik-6fca447f-1612-4d56-8ae4-827b4c967c52 Date: Sun, 24 Jan 2021 22:12:00 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:XPkSroIWAFEFs/c4au3lbZvgEluL2v58KnePUm3hG/2ag/zEBr/j4MeW+efB5GTSHpoH/ Rc5+TQtqYHz4Q1FD/aCjeAy+hg2NnvhwTy61L6IVKYnPiHpOp+m5yWnlh7jITFiPAuSTtnRXPyHU IeTrqPIx4GTL9k9+sKumJH9lCDwQRNnn34L+WkMx/8W/4wz+Cs05KmUiWjDXhWVqmHeuwqaa4Ke6 JWOZ/jtaypWuO//c+gwpQpKAmvx9M382qRYgUuSry4R5EXzTJby9I2vrfAd8LJ388RkNvt2JawbA 4k= X-UI-Out-Filterresults: notjunk:1;V03:K0:sWVzi/DEUEY=:Ps5PDL4/t4EFMtrVpD2yj2 FEokSQdvDc0s12mcw2hCiF1oIFMnkTSHOiGJeveEmtvFkVjyrHX1BNSiepWBumGGodURBei6Z mt8qdYp+ZBVmIL4TsRlS/7a6+/yyZSbyPG1ZPiFg79VIqVDpoFJe9XCnlXp27G5K4YB7/8SBm P94974nTlR1Hc0n41eYgZnCHtZAxs6lKdg7Nvo4bCTu6X6zxMQO+0OCTZnyQ4kMhooBDo4KwR MGNOE2D8faXDXJyEv+v8oJKi90hlO8e7b+Dpr0ieH09l+7aC+PSVFgolxmqwchP4MG/dsSZTJ u8E8GjSYETGKAILLUEtIQoSpysZAerok/2UZnHQm/inIESsZ2QtBkxPTDo0Bn7oTu8fzfvUt6 u3NvGxHWXT000u3M3ABlvjuZyyZFyzlijwfKkR9WTKmNftUHi4Zkw/oqr2U4nkwgtHVdeHuUm 2HU285Pb7ClWrKaYBQ3PVsLy0H0jDRcKz/jXiGAJ1zm/w6L698djWzEqnIxrX+lFbXqbNf29z GqsF15Me1aEMNjrPP5IBxTOQV7XEI6F8w0/WqMBUqiRD/W2KmRW1inQnYobC4fO3lkQMOn3Z/ T+A1J16ueRQtE= X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Jan 2021 21:12:04 -0000 --refeik-6fca447f-1612-4d56-8ae4-827b4c967c52 Content-Type: text/plain; charset=UTF-8 Dear all, the attached patch is pretty much self-explaining: check for bounds violation when initializing a substring in a data statement and treat the resulting error. If more detailed information should be emitted with the error message, I'm open for suggestions. Regtested on x86_64-pc-linux-gnu. OK for master? Thanks, Harald PR fortran/70070 - ICE on initializing character data beyond min/max bound Check for initialization of substrings beyond bounds in DATA statements. gcc/fortran/ChangeLog: PR fortran/70070 * data.c (create_character_initializer): Check substring indices against bounds. (gfc_assign_data_value): Catch error returned from create_character_initializer. gcc/testsuite/ChangeLog: PR fortran/70070 * gfortran.dg/pr70070.f90: New test. --refeik-6fca447f-1612-4d56-8ae4-827b4c967c52 Content-Type: text/x-patch Content-Disposition: attachment; filename=pr70070.patch Content-Transfer-Encoding: quoted-printable diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c index 1313b335c86..d9f0b45da9b 100644 =2D-- a/gcc/fortran/data.c +++ b/gcc/fortran/data.c @@ -183,6 +183,13 @@ create_character_initializer (gfc_expr *init, gfc_typ= espec *ts, } } + if (start < 0 || end > init->value.character.length) + { + gfc_error ("Invalid substring in DATA statement at %L", + &ref->u.ss.start->where); + return NULL; + } + if (rvalue->ts.type =3D=3D BT_HOLLERITH) { for (size_t i =3D 0; i < (size_t) len; i++) @@ -576,6 +583,8 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rva= lue, mpz_t index, if (lvalue->ts.u.cl->length =3D=3D NULL && !(ref && ref->u.ss.lengt= h !=3D NULL)) return false; expr =3D create_character_initializer (init, last_ts, ref, rvalue); + if (!expr) + return false; } else { diff --git a/gcc/testsuite/gfortran.dg/pr70070.f90 b/gcc/testsuite/gfortra= n.dg/pr70070.f90 new file mode 100644 index 00000000000..c79cd229552 =2D-- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr70070.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! PR fortran/70070 - ICE on initializing character data beyond min/max bo= und + +program p + character(1) :: a, b + data (a(i:i),i=3D0,0) /1*'#'/ ! { dg-error "Invalid substring" } + data (b(i:i),i=3D1,2) /2*'#'/ ! { dg-error "Invalid substring" } +end --refeik-6fca447f-1612-4d56-8ae4-827b4c967c52--