Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!cwjcc!tut.cis.ohio-state.edu!boring.cray.com!hrp From: hrp@boring.cray.com (Hal Peterson) Newsgroups: gnu.gdb.bug Subject: Re: gdb seg fault (subscript out of bound) on invalid signal number Message-ID: <8907241754.AA13351@rothko.cray.com> Date: 24 Jul 89 17:54:30 GMT References: <8907171834.AA19716@ivy.ucdavis.edu> Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: Cray Research, Inc. Lines: 64 The same thing happens with 3.2 on a Sun-3 running SunOS 3.5. The problem (in 3.2, anyway) is that signals_info isn't doing a bounds check on the signal number, and since there are only 32 signals, it indexes off the end of the sys_siglist array. Following my .signature is a patch to fix it in 3.2. -- Hal Peterson Domain: hrp@cray.com Cray Research Old style: hrp%cray.com@uc.msc.umn.edu 1440 Northland Dr. UUCP: uunet!cray!hrp Mendota Hts, MN 55120 USA Telephone: +1 612 681 3145 ======================================================================== *** infrun-DIST.c Wed Jul 5 14:46:07 1989 --- infrun.c Mon Jul 24 12:37:50 1989 *************** *** 1223,1241 **** char *signum_exp; { register int i; ! printf_filtered ("Number\tStop\tPrint\tPass to program\tDescription\n"); if (signum_exp) { i = parse_and_eval_address (signum_exp); ! printf_filtered ("%d\t", i); ! printf_filtered ("%s\t", signal_stop[i] ? "Yes" : "No"); ! printf_filtered ("%s\t", signal_print[i] ? "Yes" : "No"); ! printf_filtered ("%s\t\t", signal_program[i] ? "Yes" : "No"); ! printf_filtered ("%s\n", sys_siglist[i]); return; } printf_filtered ("\n"); for (i = 0; i < NSIG; i++) { --- 1223,1251 ---- char *signum_exp; { register int i; ! register char *heading = ! "Number\tStop\tPrint\tPass to program\tDescription\n"; if (signum_exp) { i = parse_and_eval_address (signum_exp); ! if ((i < NSIG) && (i >= 0)) ! { ! printf_filtered (heading); ! printf_filtered ("%d\t", i); ! printf_filtered ("%s\t", signal_stop[i] ? "Yes" : "No"); ! printf_filtered ("%s\t", signal_print[i] ? "Yes" : "No"); ! printf_filtered ("%s\t\t", signal_program[i] ? "Yes" : "No"); ! printf_filtered ("%s\n", sys_siglist[i]); ! } ! else ! { ! error ("Invalid signal %d given as argument to \"info signal\"", i); ! } return; } + printf_filtered (heading); printf_filtered ("\n"); for (i = 0; i < NSIG; i++) {