This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: bug in gdb/target.c:target_signal_to_name
- From: Andrew Cagney <ac131313 at cygnus dot com>
- To: Petr Ledvina <ledvinap at kae dot zcu dot cz>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Sun, 13 Jan 2002 16:10:05 -0500
- Subject: Re: bug in gdb/target.c:target_signal_to_name
- References: <Pine.OSF.4.33.0111301833160.4557-100000@eryx1.zcu.cz>
> When remote target returns some invalid signal, gdb vill crash with
> segfault. The problem seems to be in function target_signal_to_name,
> which doesn't check, if signal is in bounds and returns invalid name.
>
> This version will (at least) not segfault:
>
> /* Return the name for a signal. */
> char *
> target_signal_to_name (sig)
> enum target_signal sig;
> {
> if (sig == TARGET_SIGNAL_UNKNOWN)
> /* I think the code which prints this will always print it along with
> the string, so no need to be verbose. */
> return "?";
> if ((sig >= TARGET_SIGNAL_FIRST) && (sig <= TARGET_SIGNAL_LAST))
> return signals[sig].name;
> else
> return signals[TARGET_SIGNAL_UNKNOWN].name;
> }
Thanks. I've committed the attached.
Andrew
2002-01-13 Andrew Cagney <ac131313@redhat.com>
From Petr Ledvina <ledvinap@kae.zcu.cz>:
* signals.c (target_signal_to_name): Verify that SIG is within the
bounds of the signals array.
Index: signals.c
===================================================================
RCS file: /cvs/src/src/gdb/signals.c,v
retrieving revision 1.1
diff -p -r1.1 signals.c
*** signals.c 2001/07/19 18:09:11 1.1
--- signals.c 2002/01/13 21:04:30
*************** target_signal_to_name (enum target_signa
*** 214,220 ****
/* I think the code which prints this will always print it along with
the string, so no need to be verbose. */
return "?";
! return signals[sig].name;
}
/* Given a name, return its signal. */
--- 214,223 ----
/* I think the code which prints this will always print it along with
the string, so no need to be verbose. */
return "?";
! else if ((sig >= TARGET_SIGNAL_FIRST) && (sig <= TARGET_SIGNAL_LAST))
! return signals[sig].name;
! else
! return signals[sig].name;
}
/* Given a name, return its signal. */