From: Po Lu Date: Fri, 5 Jul 2024 04:09:52 +0000 (+0800) Subject: Enable Gnulib substitute on Android systems with defective strnlen X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=54209665368ceb7c0585e766163e2758c2a9629d;p=emacs.git Enable Gnulib substitute on Android systems with defective strnlen * configure.ac (AC_FUNC_STRNLEN): Detect a bug where strnlen is liable to integer overflows if addition of the search limit to the string would also overflow. * src/xdisp.c (store_mode_line_string): Remove stopgap measure. (cherry picked from commit 04d7318efa20cce3aa369fdfd563d8364feb6e78) --- diff --git a/configure.ac b/configure.ac index 402e5fdc752..15deb1f89ac 100644 --- a/configure.ac +++ b/configure.ac @@ -1611,6 +1611,30 @@ AC_DEFUN([gl_TYPE_OFF64_T], [HAVE_OFF64_T=1 AC_SUBST([HAVE_OFF64_T])]) +# `strnlen' cannot accept nlen greater than the size of the object S +# on Android 2.2 and earlier. +m4_define([ORIGINAL_AC_FUNC_STRNLEN], m4_defn([AC_FUNC_STRNLEN])) +AC_DEFUN([AC_FUNC_STRNLEN], [ +AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([for strnlen capable of accepting large limits], + [emacs_cv_func_strnlen_working], + [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], [[ + volatile size_t (*strnlen_pointer) (const char *s, size_t) = &strnlen; + if ((*strnlen_pointer) ("", -1) != 0) + return 1; + return 0; +]])],[emacs_cv_func_strnlen_working=yes], + [emacs_cv_func_strnlen_working=no], + [# Guess no on Android 21 and earlier, yes elsewhere. + AS_IF([test -n "$ANDROID_SDK" && test "$ANDROID_SDK" -lt 22], + [emacs_cv_func_strnlen_working=no], + [emacs_cv_func_strnlen_working='guessing yes'])])]) +AS_IF([test "$emacs_cv_func_strnlen_working" != "no"], + [ORIGINAL_AC_FUNC_STRNLEN], + [ac_cv_func_strnlen_working=no + AC_LIBOBJ([strnlen])])]) + # Initialize gnulib right after choosing the compiler. dnl Amongst other things, this sets AR and ARFLAGS. gl_EARLY diff --git a/src/xdisp.c b/src/xdisp.c index 566c4b211d6..8c7e8e5cb43 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -28065,18 +28065,7 @@ store_mode_line_string (const char *string, Lisp_Object lisp_string, if (string != NULL) { -#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY \ - && __ANDROID_API__ < 22 - /* Circumvent a bug in memchr preventing strnlen from returning - valid values when a large limit is specified. - - https://issuetracker.google.com/issues/37020957 */ - if (precision <= 0 || ((uintptr_t) string - > (UINTPTR_MAX - precision))) - len = strlen (string); - else -#endif /* HAVE_ANDROID && !ANDROID_STUBIFY && __ANDROID_API__ < 22 */ - len = strnlen (string, precision <= 0 ? SIZE_MAX : precision); + len = strnlen (string, precision <= 0 ? SIZE_MAX : precision); lisp_string = make_string (string, len); if (NILP (props)) props = mode_line_string_face_prop;