Re: bug in gdb/target.c:target_signal_to_name

Andrew Cagney
2002-01-13T21:10:17Z

[-- Attachment #1: Type: text/plain, Size: 776 bytes --]

> 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

[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 1091 bytes --]

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. */