From 253a5fa99d70f5c8d7a8c9bad063053da740e563 Mon Sep 17 00:00:00 2001 From: Eric Haszlakiewicz Date: Sat, 30 Jul 2022 20:27:35 +0000 Subject: [PATCH] Issue #705: disable locale handling when building for a uClibc system because its duplocale() function (intentionally) crashes. --- CMakeLists.txt | 12 ++++++++++++ ChangeLog | 2 ++ tests/test_locale.c | 2 -- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eb53cef..2be027d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,6 +192,18 @@ if (HAVE_LOCALE_H) check_symbol_exists(setlocale "locale.h" HAVE_SETLOCALE) check_symbol_exists(uselocale "locale.h" HAVE_USELOCALE) endif() + +# uClibc *intentionally* crashes in duplocale(), at least as of: +# https://github.com/ffainelli/uClibc/blob/266bdc1/libc/misc/locale/locale.c#L1322 +# So, if it looks like we're compiling for a system like that just disable +# locale handling entirely. +exec_program(${CMAKE_C_COMPILER} ARGS -dumpmachine OUTPUT_VARIABLE CMAKE_GNU_C_MACHINE) +if (CMAKE_GNU_C_MACHINE MATCHES "uclibc") + message(STATUS "Detected uClibc compiler, disabling locale handling") + set(HAVE_SETLOCALE 0) + set(HAVE_USELOCALE 0) +endif() + if (HAVE_STRINGS_H) check_symbol_exists(strcasecmp "strings.h" HAVE_STRCASECMP) check_symbol_exists(strncasecmp "strings.h" HAVE_STRNCASECMP) diff --git a/ChangeLog b/ChangeLog index 8cadae6..d04edbe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,8 @@ Significant changes and bug fixes --------------------------------- * When serializing with JSON_C_TO_STRING_PRETTY set, keep the opening and closing curly or square braces on same line for empty objects or arrays. +* Disable locale handling when targeting a uClibc system due to problems + with its duplocale() function. 0.16 (up to commit 66dcdf5, 2022-04-13) diff --git a/tests/test_locale.c b/tests/test_locale.c index 7299ee2..79f6c2c 100644 --- a/tests/test_locale.c +++ b/tests/test_locale.c @@ -24,8 +24,6 @@ int main(int argc, char **argv) json_object *new_obj; #ifdef HAVE_SETLOCALE setlocale(LC_NUMERIC, "de_DE"); -#else - printf("No locale\n"); #endif char buf1[10], buf2[10]; -- 2.49.0