CryptoPkg/Crt: turn strchr() into a function (CVE-2019-14553)
authorLaszlo Ersek <>
Thu, 24 Oct 2019 14:44:08 +0000 (16:44 +0200)
committerLaszlo Ersek <>
Sat, 2 Nov 2019 11:07:25 +0000 (12:07 +0100)
According to the ISO C standard, strchr() is a function. We #define it as
a macro. Unfortunately, our macro evaluates the first argument ("str")
twice. If the expression passed for "str" has side effects, the behavior
may be undefined.

In a later patch in this series, we're going to resurrect "inet_pton.c"
(originally from the StdLib package), which calls strchr() just like that:

  strchr((xdigits = xdigits_l), ch)
  strchr((xdigits = xdigits_u), ch)

To enable this kind of function call, turn strchr() into a function.

Cc: David Woodhouse <>
Cc: Jian J Wang <>
Cc: Jiaxin Wu <>
Cc: Sivaraman Nainar <>
Cc: Xiaoyu Lu <>
CVE: CVE-2019-14553
Signed-off-by: Laszlo Ersek <>
Reviewed-by: Philippe Mathieu-Daude <>
Reviewed-by: Jian J Wang <>
Reviewed-by: Jiaxin Wu <>

index 71a2ef3..42235ab 100644 (file)
@@ -115,6 +115,11 @@ QuickSortWorker (
 // -- String Manipulation Routines --\r
+char *strchr(const char *str, int ch)\r
+  return ScanMem8 (str, AsciiStrSize (str), (UINT8)ch);\r
 /* Scan a string for the last occurrence of a character */\r
 char *strrchr (const char *str, int c)\r
index 5806f50..b90da20 100644 (file)
@@ -147,6 +147,7 @@ int            isupper     (int);
 int            tolower     (int);\r
 int            strcmp      (const char *, const char *);\r
 int            strncasecmp (const char *, const char *, size_t);\r
+char           *strchr     (const char *, int);\r
 char           *strrchr    (const char *, int);\r
 unsigned long  strtoul     (const char *, char **, int);\r
 long           strtol      (const char *, char **, int);\r
@@ -188,7 +189,6 @@ void           abort       (void);
 #define strcpy(strDest,strSource)         AsciiStrCpyS(strDest,MAX_STRING_SIZE,strSource)\r
 #define strncpy(strDest,strSource,count)  AsciiStrnCpyS(strDest,MAX_STRING_SIZE,strSource,(UINTN)count)\r
 #define strcat(strDest,strSource)         AsciiStrCatS(strDest,MAX_STRING_SIZE,strSource)\r
-#define strchr(str,ch)                    ScanMem8((VOID *)(str),AsciiStrSize(str),(UINT8)ch)\r
 #define strncmp(string1,string2,count)    (int)(AsciiStrnCmp(string1,string2,(UINTN)(count)))\r
 #define strcasecmp(str1,str2)             (int)AsciiStriCmp(str1,str2)\r
 #define sprintf(buf,...)                  AsciiSPrint(buf,MAX_STRING_SIZE,__VA_ARGS__)\r