[RFC] newlib/libc/include/langinfo.h: nl_langinfo enum off by one error causing pointer overwrite

Brian Inglis Brian.Inglis@SystematicSW.ab.ca
Wed Aug 21 23:58:46 GMT 2024


if __HAVE_LOCALE_INFO__ is defined, then _NL_MESSAGES_CODESET is defined
instead of _NL_CTYPE_CODESET after _NL_CTYPE_MB_CUR_MAX, and
_NL_MESSAGES_CODESET is omitted before _NL_MESSAGES_WYESEXPR, resulting
in _NL_MESSAGES_WNOSTR pointer being overwritten by _NL_COLLATE_CODESET
pointer

demonstration of pointer overwrite by nl_langinfo dump program generated
with additional langinfo.h hack after fix:

    $ diff -4 /usr{/src/newlib-cygwin/newlib/libc,}/include/langinfo.h
    --- /usr/src/newlib-cygwin/newlib/libc/include/langinfo.h       2024-08-21 17:11:00.852069900 -0600
    +++ /usr/include/langinfo.h     2024-08-21 16:59:59.609998900 -0600
    @@ -301,9 +301,9 @@ enum
       _NL_MESSAGES_CODESET,
       _NL_MESSAGES_WYESEXPR,
       _NL_MESSAGES_WNOEXPR,
       _NL_MESSAGES_WYESSTR,
    -  _NL_MESSAGES_WNOSTR,
    +#define _NL_MESSAGES_WNOSTR _NL_MESSAGES_WYESSTR

       _NL_COLLATE_CODESET,

MESSAGES_CODESET                 UTF-8
MESSAGES_WYESEXPR                ^[+1yY]
MESSAGES_WNOEXPR                 ^[-0nN]
MESSAGES_WYESSTR                 yes
79 y 65 e 73 s 0 ^@ 6e n 6f o 0 ^@ 0 ^@	    # %hx %C dump
COLLATE_CODESET                  UTF-8

if __HAVE_LOCALE_INFO__ is not defined, then _NL_MESSAGES_CODESET is
also not defined, so it is unclear if _NL_MESSAGES_CODESET should be
defined to _NL_CTYPE_CODESET if neither __HAVE_LOCALE_INFO__ nor
__HAVE_LOCALE_INFO_EXTENDED__ are defined, or added as another field
depending on those definitions

Signed-off-by: Brian Inglis <Brian.Inglis@SystematicSW.ab.ca>
---
 newlib/libc/include/langinfo.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/newlib/libc/include/langinfo.h b/newlib/libc/include/langinfo.h
index 41d090d3710e..e383dc59d83f 100644
--- a/newlib/libc/include/langinfo.h
+++ b/newlib/libc/include/langinfo.h
@@ -179,7 +179,7 @@ enum
 
 #ifdef __HAVE_LOCALE_INFO__
   _NL_CTYPE_MB_CUR_MAX,
-  _NL_MESSAGES_CODESET,
+  _NL_CTYPE_CODESET,
 
 #ifdef __HAVE_LOCALE_INFO_EXTENDED__
 
@@ -298,6 +298,7 @@ enum
   _NL_MONETARY_WPOSITIVE_SIGN,
   _NL_MONETARY_WNEGATIVE_SIGN,
 
+  _NL_MESSAGES_CODESET,
   _NL_MESSAGES_WYESEXPR,
   _NL_MESSAGES_WNOEXPR,
   _NL_MESSAGES_WYESSTR,
-- 
2.45.1



More information about the Newlib mailing list