[libcxx-commits] [PATCH] D69505: [libcxx] [Windows] Store the lconv struct returned from localeconv in locale_t

Martin Storsjö via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Oct 28 04:33:34 PDT 2019


mstorsjo created this revision.
mstorsjo added reviewers: pcc, thomasanderson, EricWF.
Herald added subscribers: ldionne, christof.

This fixes using non-default locales, which currently can crash when e.g. formatting numbers.

Within the localeconv_l function, the per-thread locale is temporarily changed with __libcpp_locale_guard, then localeconv() is called, returning an lconv * struct pointer.

When localeconv_l returns, the __libcpp_locale_guard dtor restores the per-thread locale back to the original. This invalidates the contents of the earlier returned lconv struct, and all C strings that are pointed to within it are also invalidated.

Thus, to have an actually working localeconv_l function, the function needs to allocate some sort of storage for the returned contents, that stays valid for as long as the caller needs to use the returned struct.

Extend the libcxx/win32 specific locale_t class with storage for a deep copy of a lconv struct, and change localeconv_l to take a reference to the locale_t, to allow it to store the returned lconv struct there.

This works fine for libcxx itself, but wouldn't necessarily be right for a caller that uses libcxx's localeconv_l function.


Repository:
  rCXX libc++

https://reviews.llvm.org/D69505

Files:
  libcxx/include/support/win32/locale_win32.h
  libcxx/src/support/win32/locale_win32.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69505.226639.patch
Type: text/x-patch
Size: 4553 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20191028/f826b71f/attachment.bin>


More information about the libcxx-commits mailing list