diff options
| author | Paul Eggert | 2023-08-06 09:08:56 -0700 |
|---|---|---|
| committer | Paul Eggert | 2023-08-06 09:13:12 -0700 |
| commit | 1cc20535f8730f49cd5d012313c1eaf0627d7216 (patch) | |
| tree | ad959102c73fd9dc9b65843f1b6bf44bb8abb37e | |
| parent | 400df210ce0cc1ee0113b14a5ad92764d148c620 (diff) | |
| download | emacs-1cc20535f8730f49cd5d012313c1eaf0627d7216.tar.gz emacs-1cc20535f8730f49cd5d012313c1eaf0627d7216.zip | |
Stop using printf %n
* src/emacs.c (shut_down_emacs): Don’t use printf’s "%n" format.
Android, MS-Windows, and OpenBSD don’t support it, and it’s easy
enough to do its equivalent by hand.
| -rw-r--r-- | src/emacs.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/emacs.c b/src/emacs.c index 80a013b68df..5a036554a87 100644 --- a/src/emacs.c +++ b/src/emacs.c | |||
| @@ -2959,24 +2959,31 @@ shut_down_emacs (int sig, Lisp_Object stuff) | |||
| 2959 | reset_all_sys_modes (); | 2959 | reset_all_sys_modes (); |
| 2960 | if (sig && sig != SIGTERM) | 2960 | if (sig && sig != SIGTERM) |
| 2961 | { | 2961 | { |
| 2962 | static char const fmt[] = "Fatal error %d: %n%s\n"; | ||
| 2963 | #ifdef HAVE_HAIKU | 2962 | #ifdef HAVE_HAIKU |
| 2964 | if (haiku_debug_on_fatal_error) | 2963 | if (haiku_debug_on_fatal_error) |
| 2965 | debugger ("Fatal error in Emacs"); | 2964 | debugger ("Fatal error in Emacs"); |
| 2966 | #endif | 2965 | #endif |
| 2967 | char buf[max ((sizeof fmt - sizeof "%d%n%s\n" | 2966 | /* Output a "Fatal error NUM: DESC\n" diagnostic with a single write, |
| 2967 | but use multiple writes if the diagnosic is absurdly long | ||
| 2968 | and likely couldn't be written atomically anyway. */ | ||
| 2969 | static char const fmt[] = "Fatal error %d: "; | ||
| 2970 | char buf[max ((sizeof fmt - sizeof "%d" | ||
| 2968 | + INT_STRLEN_BOUND (int) + 1), | 2971 | + INT_STRLEN_BOUND (int) + 1), |
| 2969 | min (PIPE_BUF, MAX_ALLOCA))]; | 2972 | min (PIPE_BUF, MAX_ALLOCA))]; |
| 2970 | char const *sig_desc = safe_strsignal (sig); | 2973 | char const *sig_desc = safe_strsignal (sig); |
| 2971 | int nlen; | 2974 | size_t sig_desclen = strlen (sig_desc); |
| 2972 | int buflen = snprintf (buf, sizeof buf, fmt, sig, &nlen, sig_desc); | 2975 | int nlen = sprintf (buf, fmt, sig); |
| 2973 | if (0 <= buflen && buflen < sizeof buf) | 2976 | if (nlen + sig_desclen < sizeof buf - 1) |
| 2974 | emacs_write (STDERR_FILENO, buf, buflen); | 2977 | { |
| 2978 | char *p = mempcpy (buf + nlen, sig_desc, sig_desclen); | ||
| 2979 | *p++ = '\n'; | ||
| 2980 | emacs_write (STDERR_FILENO, buf, p - buf); | ||
| 2981 | } | ||
| 2975 | else | 2982 | else |
| 2976 | { | 2983 | { |
| 2977 | emacs_write (STDERR_FILENO, buf, nlen); | 2984 | emacs_write (STDERR_FILENO, buf, nlen); |
| 2978 | emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc)); | 2985 | emacs_write (STDERR_FILENO, sig_desc, sig_desclen); |
| 2979 | emacs_write (STDERR_FILENO, fmt + sizeof fmt - 2, 1); | 2986 | emacs_write (STDERR_FILENO, "\n", 1); |
| 2980 | } | 2987 | } |
| 2981 | } | 2988 | } |
| 2982 | } | 2989 | } |