diff options
-rw-r--r-- | shells/fish/Makefile | 3 | ||||
-rw-r--r-- | shells/fish/files/patch-src_fallback.cpp | 16 | ||||
-rw-r--r-- | shells/fish/files/patch-src_fallback.h | 19 |
3 files changed, 37 insertions, 1 deletions
diff --git a/shells/fish/Makefile b/shells/fish/Makefile index b89f358b99af..25b7e93bf14c 100644 --- a/shells/fish/Makefile +++ b/shells/fish/Makefile @@ -3,6 +3,7 @@ PORTNAME= fish PORTVERSION= 3.0.0 +PORTREVISION= 1 CATEGORIES= shells MASTER_SITES= https://github.com/fish-shell/fish-shell/releases/download/${PORTVERSION}/ @@ -15,7 +16,7 @@ LIB_DEPENDS+= libpcre2-32.so:devel/pcre2 # The python dependency is only needed by shebangfix. At runtime python is # only needed by some optional scripts that aren't in PATH. -USES= cmake cpe ncurses python:3.4+:build \ +USES= cmake cpe ncurses python:3.4+,build \ localbase compiler:c++11-lang shebangfix SHEBANG_FILES= share/tools/*.py share/tools/web_config/webconfig.py diff --git a/shells/fish/files/patch-src_fallback.cpp b/shells/fish/files/patch-src_fallback.cpp new file mode 100644 index 000000000000..5e0cb1c5f03c --- /dev/null +++ b/shells/fish/files/patch-src_fallback.cpp @@ -0,0 +1,16 @@ +--- src/fallback.cpp ++++ src/fallback.cpp +@@ -390,9 +390,10 @@ int flock(int fd, int op) { + #endif // HAVE_FLOCK + + #ifndef HAVE_WCSTOD_L +-// musl doesn't feature wcstod_l, +-// so we just wrap wcstod. +-double wcstod_l(const wchar_t *enptr, wchar_t **endptr, locale_t loc) { ++#undef wcstod_l ++// For platforms without wcstod_l C extension, wrap wcstod after changing the ++// thread-specific locale. ++double fish_compat::wcstod_l(const wchar_t *enptr, wchar_t **endptr, locale_t loc) { + char *saved_locale = strdup(setlocale(LC_NUMERIC, NULL)); + // Yes, this is hardcoded to use the "C" locale. + // That's the only thing we need, and uselocale(loc) broke in my testing. diff --git a/shells/fish/files/patch-src_fallback.h b/shells/fish/files/patch-src_fallback.h new file mode 100644 index 000000000000..5854cdbc3f71 --- /dev/null +++ b/shells/fish/files/patch-src_fallback.h @@ -0,0 +1,19 @@ +--- src/fallback.h ++++ src/fallback.h +@@ -200,5 +200,15 @@ int flock(int fd, int op); + #endif + + #ifndef HAVE_WCSTOD_L +-double wcstod_l(const wchar_t *enptr, wchar_t **endptr, locale_t loc); ++// On some platforms if this is incorrectly detected and a system-defined ++// defined version of `wcstod_l` exists, calling `wcstod` from our own ++// `wcstod_l` can call back into `wcstod_l` causing infinite recursion. ++// e.g. FreeBSD defines `wcstod(x, y)` as `wcstod_l(x, y, __get_locale())`. ++// Solution: namespace our implementation to make sure there is no symbol ++// duplication. ++#undef wcstod_l ++namespace fish_compat { ++ double wcstod_l(const wchar_t *enptr, wchar_t **endptr, locale_t loc); ++} ++#define wcstod_l(x, y, z) fish_compat::wcstod_l(x, y, z) + #endif |