From: Eli Zaretskii Date: Sun, 19 Apr 2020 16:38:53 +0000 (+0300) Subject: Don't use Gnulib's explicit_bzero on MS-Windows X-Git-Tag: emacs-28.0.90~7542 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3f8b771da96f9a55dd5ed322104135a0c2c6f2e4;p=emacs.git Don't use Gnulib's explicit_bzero on MS-Windows This is a preventive change, since Gnulib was recently changed its explicit_bzero to call SecureZeroMemory on MS-Windows, disregarding systems older than XP, which didn't have it. * src/w32.c (explicit_bzero): New function. * nt/mingw-cfg.site (ac_cv_func_explicit_bzero): Avoid using the Gnulib replacement for explicit_bzero. * nt/inc/ms-w32.h (explicit_bzero): Add prototype. --- diff --git a/nt/inc/ms-w32.h b/nt/inc/ms-w32.h index 1cce2c3062f..cbe35ea1053 100644 --- a/nt/inc/ms-w32.h +++ b/nt/inc/ms-w32.h @@ -440,6 +440,7 @@ extern int alarm (int); extern int sys_kill (pid_t, int); +extern void explicit_bzero (void *, size_t); /* For integration with MSDOS support. */ #define getdisk() (_getdrive () - 1) diff --git a/nt/mingw-cfg.site b/nt/mingw-cfg.site index 2271eef98d6..2e898c745e5 100644 --- a/nt/mingw-cfg.site +++ b/nt/mingw-cfg.site @@ -109,6 +109,7 @@ ac_cv_func_futimens=not-needed gl_cv_func_futimens_works="not-needed-so-yes" ac_cv_func_utimensat=yes gl_cv_func_utimensat_works=yes +ac_cv_func_explicit_bzero=yes # Aliased to _commit in ms-w32.h ac_cv_func_fsync=yes ac_cv_func_fdatasync=yes diff --git a/src/w32.c b/src/w32.c index 42c832a5937..0f69e652a57 100644 --- a/src/w32.c +++ b/src/w32.c @@ -2370,6 +2370,26 @@ srandom (int seed) iz = rand () % RAND_MAX_Z; } +/* Emulate explicit_bzero. This is to avoid using the Gnulib version, + because it calls SecureZeroMemory at will, disregarding systems + older than Windows XP, which didn't have that function. We want to + avoid having that function as dependency in builds that need to + support systems older than Windows XP, otherwise Emacs will refuse + to start on those systems. */ +void +explicit_bzero (void *buf, size_t len) +{ +#if _WIN32_WINNT >= 0x0501 + /* We are compiling for XP or newer, most probably with MinGW64. + We can use SecureZeroMemory. */ + SecureZeroMemory (buf, len); +#else + memset (buf, 0, len); + /* Compiler barrier. */ + asm volatile ("" ::: "memory"); +#endif +} + /* Return the maximum length in bytes of a multibyte character sequence encoded in the current ANSI codepage. This is required to correctly walk the encoded file names one character at a time. */