diff options
| author | Paul Eggert | 2015-11-23 15:45:29 -0800 |
|---|---|---|
| committer | Paul Eggert | 2015-11-23 15:46:11 -0800 |
| commit | 4f10c3cdefc3d858bf297e55fb4a9ced36721bbb (patch) | |
| tree | b553a9399a6c54c02d5c964055b4c83cbd4ab1e2 | |
| parent | 58dfc16cd0befe0122ecc2c452e48135495519aa (diff) | |
| download | emacs-4f10c3cdefc3d858bf297e55fb4a9ced36721bbb.tar.gz emacs-4f10c3cdefc3d858bf297e55fb4a9ced36721bbb.zip | |
module_format_fun_env fixes
* src/doprnt.c (exprintf) [HAVE_MODULES]: Also define in this case.
* src/emacs-module.c (module_format_fun_env):
Convert path and sym to UTF-8.
Don’t use VLAs, as the C11 standard says they’re optional,
and anyway they can cause core dumps with large allocations.
Use exprintf rather than snprintf, as exprintf handles arbitrarily
long strings. Simplify the code a bit.
| -rw-r--r-- | src/doprnt.c | 2 | ||||
| -rw-r--r-- | src/emacs-module.c | 32 |
2 files changed, 14 insertions, 20 deletions
diff --git a/src/doprnt.c b/src/doprnt.c index 51f8fd72ba0..55f249f5d72 100644 --- a/src/doprnt.c +++ b/src/doprnt.c | |||
| @@ -500,7 +500,7 @@ esprintf (char *buf, char const *format, ...) | |||
| 500 | return nbytes; | 500 | return nbytes; |
| 501 | } | 501 | } |
| 502 | 502 | ||
| 503 | #if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT | 503 | #if HAVE_MODULES || (defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT) |
| 504 | 504 | ||
| 505 | /* Format to buffer *BUF of positive size *BUFSIZE, reallocating *BUF | 505 | /* Format to buffer *BUF of positive size *BUFSIZE, reallocating *BUF |
| 506 | and updating *BUFSIZE if the buffer is too small, and otherwise | 506 | and updating *BUFSIZE if the buffer is too small, and otherwise |
diff --git a/src/emacs-module.c b/src/emacs-module.c index a24d85537bd..1a5e253c969 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c | |||
| @@ -1039,25 +1039,19 @@ module_format_fun_env (const struct module_fun_env *env) | |||
| 1039 | { | 1039 | { |
| 1040 | /* Try to print a function name if possible. */ | 1040 | /* Try to print a function name if possible. */ |
| 1041 | const char *path, *sym; | 1041 | const char *path, *sym; |
| 1042 | if (dynlib_addr (env->subr, &path, &sym)) | 1042 | char buffer[256]; |
| 1043 | { | 1043 | char *buf = buffer; |
| 1044 | static char const format[] = "#<module function %s from %s>"; | 1044 | ptrdiff_t bufsize = sizeof buffer; |
| 1045 | int size = snprintf (NULL, 0, format, sym, path); | 1045 | ptrdiff_t size |
| 1046 | eassert (size > 0); | 1046 | = (dynlib_addr (env->subr, &path, &sym) |
| 1047 | char buffer[size + 1]; | 1047 | ? exprintf (&buf, &bufsize, buffer, -1, |
| 1048 | snprintf (buffer, sizeof buffer, format, sym, path); | 1048 | "#<module function %s from %s>", sym, path) |
| 1049 | return make_unibyte_string (buffer, size); | 1049 | : exprintf (&buf, &bufsize, buffer, -1, |
| 1050 | } | 1050 | "#<module function at %p>", env->subr)); |
| 1051 | else | 1051 | Lisp_Object unibyte_result = make_unibyte_string (buffer, size); |
| 1052 | { | 1052 | if (buf != buffer) |
| 1053 | static char const format[] = "#<module function at %p>"; | 1053 | xfree (buf); |
| 1054 | void *subr = env->subr; | 1054 | return code_convert_string_norecord (unibyte_result, Qutf_8, false); |
| 1055 | int size = snprintf (NULL, 0, format, subr); | ||
| 1056 | eassert (size > 0); | ||
| 1057 | char buffer[size + 1]; | ||
| 1058 | snprintf (buffer, sizeof buffer, format, subr); | ||
| 1059 | return make_unibyte_string (buffer, size); | ||
| 1060 | } | ||
| 1061 | } | 1055 | } |
| 1062 | 1056 | ||
| 1063 | 1057 | ||