From 49a9d649460c8f6ebdbf319ff9adfab260713550 Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Thu, 9 Oct 2014 14:12:39 +0200 Subject: [PATCH] catools: better out-of-bounds handling when printing enums as DBR_GR/DBR_CTRL --- src/catools/tool_lib.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/catools/tool_lib.c b/src/catools/tool_lib.c index ddead1115..71b444ccb 100644 --- a/src/catools/tool_lib.c +++ b/src/catools/tool_lib.c @@ -162,11 +162,21 @@ char *val2str (const void *v, unsigned type, int index) case DBR_ENUM: { dbr_enum_t *val = (dbr_enum_t *)val_ptr; - if (dbr_type_is_GR(type) && !enumAsNr) - sprintf(str, "%s", ((struct dbr_gr_enum *)v)->strs[val[index]]); - else if (dbr_type_is_CTRL(type) && !enumAsNr) - sprintf(str, "%s", ((struct dbr_ctrl_enum *)v)->strs[val[index]]); - else + if (dbr_type_is_GR(type) && !enumAsNr) { + if (val[index] >= MAX_ENUM_STATES) + sprintf(str, "Illegal Value (%d)", val[index]); + else if (val[index] >= ((struct dbr_gr_enum *)v)->no_str) + sprintf(str, "Enum Index Overflow (%d)", val[index]); + else + sprintf(str, "%s", ((struct dbr_gr_enum *)v)->strs[val[index]]); + } else if (dbr_type_is_CTRL(type) && !enumAsNr) { + if (val[index] >= MAX_ENUM_STATES) + sprintf(str, "Illegal Value (%d)", val[index]); + else if (val[index] >= ((struct dbr_ctrl_enum *)v)->no_str) + sprintf(str, "Enum Index Overflow (%d)", val[index]); + else + sprintf(str, "%s", ((struct dbr_ctrl_enum *)v)->strs[val[index]]); + } else sprintf(str, "%d", val[index]); } }