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.
This commit is contained in:
parent
507a13f5a1
commit
04d7318efa
2 changed files with 25 additions and 12 deletions
24
configure.ac
24
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
|
||||
|
|
13
src/xdisp.c
13
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;
|
||||
|
|
Loading…
Add table
Reference in a new issue