diff --git a/pandas/_libs/src/headers/portable.h b/pandas/_libs/src/headers/portable.h index 3464fba963a5e..91b4702d32452 100644 --- a/pandas/_libs/src/headers/portable.h +++ b/pandas/_libs/src/headers/portable.h @@ -1,16 +1,10 @@ #ifndef _PANDAS_PORTABLE_H_ #define _PANDAS_PORTABLE_H_ -// To get `strdup` from strings.h -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE 600 -#endif - #include #if defined(_MSC_VER) #define strcasecmp( s1, s2 ) _stricmp( s1, s2 ) -#define strdup _strdup #endif // GH-23516 - works around locale perf issues diff --git a/pandas/_libs/src/ujson/lib/ultrajsondec.c b/pandas/_libs/src/ujson/lib/ultrajsondec.c index c7779b8b428ae..5347db1655669 100644 --- a/pandas/_libs/src/ujson/lib/ultrajsondec.c +++ b/pandas/_libs/src/ujson/lib/ultrajsondec.c @@ -1174,15 +1174,21 @@ JSOBJ JSON_DecodeObject(JSONObjectDecoder *dec, const char *buffer, ds.dec = dec; locale = setlocale(LC_NUMERIC, NULL); + if (!locale) { + return SetError(&ds, -1, "setlocale call failed"); + } + if (strcmp(locale, "C")) { - locale = strdup(locale); - if (!locale) { - return SetError(&ds, -1, "Could not reserve memory block"); + size_t len = strlen(locale) + 1; + char *saved_locale = malloc(len); + if (saved_locale == NULL) { + return SetError(&ds, -1, "Could not reserve memory block"); } + memcpy(saved_locale, locale, len); setlocale(LC_NUMERIC, "C"); ret = decode_any(&ds); - setlocale(LC_NUMERIC, locale); - free(locale); + setlocale(LC_NUMERIC, saved_locale); + free(saved_locale); } else { ret = decode_any(&ds); } diff --git a/pandas/_libs/src/ujson/lib/ultrajsonenc.c b/pandas/_libs/src/ujson/lib/ultrajsonenc.c index 5d90710441a94..a74d505b0d0ec 100644 --- a/pandas/_libs/src/ujson/lib/ultrajsonenc.c +++ b/pandas/_libs/src/ujson/lib/ultrajsonenc.c @@ -1176,16 +1176,23 @@ char *JSON_EncodeObject(JSOBJ obj, JSONObjectEncoder *enc, char *_buffer, enc->offset = enc->start; locale = setlocale(LC_NUMERIC, NULL); + if (!locale) { + SetError(NULL, enc, "setlocale call failed"); + return NULL; + } + if (strcmp(locale, "C")) { - locale = strdup(locale); - if (!locale) { - SetError(NULL, enc, "Could not reserve memory block"); - return NULL; + size_t len = strlen(locale) + 1; + char *saved_locale = malloc(len); + if (saved_locale == NULL) { + SetError(NULL, enc, "Could not reserve memory block"); + return NULL; } + memcpy(saved_locale, locale, len); setlocale(LC_NUMERIC, "C"); encode(obj, enc, NULL, 0); - setlocale(LC_NUMERIC, locale); - free(locale); + setlocale(LC_NUMERIC, saved_locale); + free(saved_locale); } else { encode(obj, enc, NULL, 0); } diff --git a/setup.py b/setup.py index 05d4407c7e959..02b91cbb0d9b4 100755 --- a/setup.py +++ b/setup.py @@ -649,7 +649,7 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): "pandas/_libs/src/datetime", numpy.get_include(), ], - extra_compile_args=(["-D_GNU_SOURCE"] + extra_compile_args), + extra_compile_args=(extra_compile_args), extra_link_args=extra_link_args, define_macros=macros, )