mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 13:33:15 +00:00
[lib] Fix the struct message LOOKUP function to be more robust
2008-02-28 Paul Jakma <paul.jakma@sun.com> * log.c: (mes_lookup) Sowmini Varadhan diagnosed a problem where this function can cause a NULL dereference, on lookups for unknown indices, or messages with NULL strings. Can occur, e.g., debug logging code when processing received messages. Fixed to accept a pointer to a default string to be used if there is no match. * log.h: LOOKUP adjusted to match
This commit is contained in:
parent
5f56808431
commit
11486b5265
@ -1,3 +1,12 @@
|
|||||||
|
2008-02-28 Paul Jakma <paul.jakma@sun.com>
|
||||||
|
|
||||||
|
* log.c: (mes_lookup) Sowmini Varadhan diagnosed a problem where
|
||||||
|
this function can cause a NULL dereference, on lookups for unknown
|
||||||
|
indices, or messages with NULL strings. Can occur, e.g., debug
|
||||||
|
logging code when processing received messages. Fixed to accept a
|
||||||
|
pointer to a default string to be used if there is no match.
|
||||||
|
* log.h: LOOKUP adjusted to match
|
||||||
|
|
||||||
2008-02-28 Paul Jakma <paul.jakma@sun.com>
|
2008-02-28 Paul Jakma <paul.jakma@sun.com>
|
||||||
|
|
||||||
* linklist.c: This implementation expects that the data pointer not
|
* linklist.c: This implementation expects that the data pointer not
|
||||||
|
29
lib/log.c
29
lib/log.c
@ -752,14 +752,24 @@ lookup (struct message *mes, int key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Older/faster version of message lookup function, but requires caller to pass
|
/* Older/faster version of message lookup function, but requires caller to pass
|
||||||
in the array size (instead of relying on a 0 key to terminate the search). */
|
* in the array size (instead of relying on a 0 key to terminate the search).
|
||||||
|
*
|
||||||
|
* The return value is the message string if found, or the 'none' pointer
|
||||||
|
* provided otherwise.
|
||||||
|
*/
|
||||||
const char *
|
const char *
|
||||||
mes_lookup (struct message *meslist, int max, int index)
|
mes_lookup (struct message *meslist, int max, int index, const char *none)
|
||||||
{
|
{
|
||||||
|
int pos = index - meslist[0].key;
|
||||||
|
|
||||||
/* first check for best case: index is in range and matches the key
|
/* first check for best case: index is in range and matches the key
|
||||||
value in that slot */
|
* value in that slot.
|
||||||
if ((index >= 0) && (index < max) && (meslist[index].key == index))
|
* NB: key numbering might be offset from 0. E.g. protocol constants
|
||||||
return meslist[index].str;
|
* often start at 1.
|
||||||
|
*/
|
||||||
|
if ((pos >= 0) && (pos < max)
|
||||||
|
&& (meslist[pos].key == index))
|
||||||
|
return meslist[pos].str;
|
||||||
|
|
||||||
/* fall back to linear search */
|
/* fall back to linear search */
|
||||||
{
|
{
|
||||||
@ -769,14 +779,17 @@ mes_lookup (struct message *meslist, int max, int index)
|
|||||||
{
|
{
|
||||||
if (meslist->key == index)
|
if (meslist->key == index)
|
||||||
{
|
{
|
||||||
|
const char *str = (meslist->str ? meslist->str : none);
|
||||||
|
|
||||||
zlog_debug ("message index %d [%s] found in position %d (max is %d)",
|
zlog_debug ("message index %d [%s] found in position %d (max is %d)",
|
||||||
index, meslist->str, i, max);
|
index, str, i, max);
|
||||||
return meslist->str;
|
return str;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
zlog_err("message index %d not found (max is %d)", index, max);
|
zlog_err("message index %d not found (max is %d)", index, max);
|
||||||
return NULL;
|
assert (none);
|
||||||
|
return none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wrapper around strerror to handle case where it returns NULL. */
|
/* Wrapper around strerror to handle case where it returns NULL. */
|
||||||
|
@ -142,10 +142,12 @@ extern int zlog_reset_file (struct zlog *zl);
|
|||||||
extern int zlog_rotate (struct zlog *);
|
extern int zlog_rotate (struct zlog *);
|
||||||
|
|
||||||
/* For hackey massage lookup and check */
|
/* For hackey massage lookup and check */
|
||||||
#define LOOKUP(x, y) mes_lookup(x, x ## _max, y)
|
#define LOOKUP(x, y) mes_lookup(x, x ## _max, y, "(no item found)")
|
||||||
|
|
||||||
extern const char *lookup (struct message *, int);
|
extern const char *lookup (struct message *, int);
|
||||||
extern const char *mes_lookup (struct message *meslist, int max, int index);
|
extern const char *mes_lookup (struct message *meslist,
|
||||||
|
int max, int index,
|
||||||
|
const char *no_item);
|
||||||
|
|
||||||
extern const char *zlog_priority[];
|
extern const char *zlog_priority[];
|
||||||
extern const char *zlog_proto_names[];
|
extern const char *zlog_proto_names[];
|
||||||
|
Loading…
Reference in New Issue
Block a user