]> code.delx.au - gnu-emacs/commitdiff
module_format_fun_env fixes
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 23 Nov 2015 23:45:29 +0000 (15:45 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 23 Nov 2015 23:46:11 +0000 (15:46 -0800)
* 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.

src/doprnt.c
src/emacs-module.c

index 51f8fd72ba026cede785c7d81c136ffdce79d1e5..55f249f5d726984339806f7f520a8094ede5db38 100644 (file)
@@ -500,7 +500,7 @@ esprintf (char *buf, char const *format, ...)
   return nbytes;
 }
 
-#if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT
+#if HAVE_MODULES || (defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT)
 
 /* Format to buffer *BUF of positive size *BUFSIZE, reallocating *BUF
    and updating *BUFSIZE if the buffer is too small, and otherwise
index a24d85537bd1ead8cdd893e5d95d67c005a198e9..1a5e253c969c0ba6a41b124e17c55b945bc0b304 100644 (file)
@@ -1039,25 +1039,19 @@ module_format_fun_env (const struct module_fun_env *env)
 {
   /* Try to print a function name if possible.  */
   const char *path, *sym;
-  if (dynlib_addr (env->subr, &path, &sym))
-    {
-      static char const format[] = "#<module function %s from %s>";
-      int size = snprintf (NULL, 0, format, sym, path);
-      eassert (size > 0);
-      char buffer[size + 1];
-      snprintf (buffer, sizeof buffer, format, sym, path);
-      return make_unibyte_string (buffer, size);
-    }
-  else
-    {
-      static char const format[] = "#<module function at %p>";
-      void *subr = env->subr;
-      int size = snprintf (NULL, 0, format, subr);
-      eassert (size > 0);
-      char buffer[size + 1];
-      snprintf (buffer, sizeof buffer, format, subr);
-      return make_unibyte_string (buffer, size);
-    }
+  char buffer[256];
+  char *buf = buffer;
+  ptrdiff_t bufsize = sizeof buffer;
+  ptrdiff_t size
+    = (dynlib_addr (env->subr, &path, &sym)
+       ? exprintf (&buf, &bufsize, buffer, -1,
+                  "#<module function %s from %s>", sym, path)
+       : exprintf (&buf, &bufsize, buffer, -1,
+                  "#<module function at %p>", env->subr));
+  Lisp_Object unibyte_result = make_unibyte_string (buffer, size);
+  if (buf != buffer)
+    xfree (buf);
+  return code_convert_string_norecord (unibyte_result, Qutf_8, false);
 }
 
 \f