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 /src/emacs-module.c | |
| 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.
Diffstat (limited to 'src/emacs-module.c')
| -rw-r--r-- | src/emacs-module.c | 32 |
1 files changed, 13 insertions, 19 deletions
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 | ||