how@IVY.UCDAVIS.EDU (W. Wilson Ho) (07/18/89)
------- Start of forwarded message ------- From: crawford@iris (Rick Crawford) To: debug@iris Cc: crawford@iris Subject: gdb 3.1 bug Date: Thu, 13 Jul 89 18:31:34 pdt Although the fix is easy (in signals_info() in infrun.c), it's still disconcerting to find stuff like this: > iris:37%gdb > GDB 3.1, Copyright (C) 1988 Free Software Foundation, Inc. > There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details. > GDB is free software and you are welcome to distribute copies of it > under certain conditions; type "info copying" to see the conditions. > Type "help" for a list of commands. > (gdb) info sig 44 > Number Stop Print Pass to program Description > Segmentation fault > iris:38% ------- End of forwarded message -------
hrp@boring.cray.com (Hal Peterson) (07/25/89)
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++) {