From a6df505d591483d1813ff844319930b9171f7162 Mon Sep 17 00:00:00 2001 From: kungfooman Date: Fri, 14 Dec 2018 02:23:13 +0100 Subject: [PATCH] Prevent Q_IsColorString from asserting on negative ascii chars --- code/qcommon/q_shared.c | 22 ++++++++++++++++++++++ code/qcommon/q_shared.h | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/qcommon/q_shared.c b/code/qcommon/q_shared.c index a9fd68c7..e845c283 100644 --- a/code/qcommon/q_shared.c +++ b/code/qcommon/q_shared.c @@ -23,6 +23,28 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // q_shared.c -- stateless support routines that are included in each code dll #include "q_shared.h" +// ^[0-9a-zA-Z] +qboolean Q_IsColorString(const char *p) { + if (!p) + return qfalse; + + if (p[0] != Q_COLOR_ESCAPE) + return qfalse; + + if (p[1] == 0) + return qfalse; + + // isalnum expects a signed integer in the range -1 (EOF) to 255, or it might assert on undefined behaviour + // a dereferenced char pointer has the range -128 to 127, so we just need to rangecheck the negative part + if (p[1] < 0) + return qfalse; + + if (isalnum(p[1]) == 0) + return qfalse; + + return qtrue; +} + float Com_Clamp( float min, float max, float value ) { if ( value < min ) { return min; diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 629334af..7d8b509c 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -409,7 +409,7 @@ extern vec4_t colorMdGrey; extern vec4_t colorDkGrey; #define Q_COLOR_ESCAPE '^' -#define Q_IsColorString(p) ((p) && *(p) == Q_COLOR_ESCAPE && *((p)+1) && isalnum(*((p)+1))) // ^[0-9a-zA-Z] +qboolean Q_IsColorString(const char *p); // ^[0-9a-zA-Z] #define COLOR_BLACK '0' #define COLOR_RED '1'