Eximon: fix string-handling. Bug 2500
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 21 Dec 2019 20:31:31 +0000 (20:31 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 21 Dec 2019 20:31:31 +0000 (20:31 +0000)
doc/doc-txt/ChangeLog
src/OS/Makefile-Base
src/src/functions.h
src/src/string.c

index f4963389ee85f308496a0d30f1bf5ac7d9d5416f..e200c529149f3229e622359854a911c6c14c4a34 100644 (file)
@@ -53,6 +53,11 @@ JH/13 Bug 2498: Reset a counter used for ARC verify before handling another
       the following one did not, a crash could result when adding an
       Authentication-Results: header.
 
+JH/14 Bug 2500: Rewind some of the common-coding in string handling between the
+      Exim main code and Exim-related utities.  The introduction of taint
+      tracking also did many adjustments to string handling.  Since then, eximon
+      frequently terminated with an assert failure.
+
 
 Exim version 4.93
 -----------------
index 36af8308d05333cb6a43623c7a4bbb2a4373c130..7122bc019f374e2e4af67044d18c98409eded203 100644 (file)
@@ -870,9 +870,9 @@ em_text.o:       ../exim_monitor/em_text.c    ../exim_monitor/em_hdr.h
 em_xs.o:         ../exim_monitor/em_xs.c      ../exim_monitor/em_hdr.h
 em_version.o:    ../exim_monitor/em_version.c ../exim_monitor/em_hdr.h
 $(MONBIN): $(HDRS)
-                @echo "$(CC) exim_monitor/`echo $@ | sed 's/o$$/c/'`"
-                $(FE)$(CC) -o $@ -c $(CFLAGS) -I. -I../exim_monitor $(INCLUDE) $(XINCLUDE) \
-                  ../exim_monitor/`echo $@ | sed 's/o$$/c/'`
+                @echo "$(CC) exim_monitor/$(@:.o=.c)"
+                $(FE)$(CC) -o $@ -c $(CFLAGS) -DCOMPILE_UTILITY -I. -I../exim_monitor $(INCLUDE) $(XINCLUDE) \
+                  ../exim_monitor/$(@:.o=.c)
 
 
 # Targets for the various libraries that Exim uses.
index ea3cf257c5f6869043b38a2959b08683c4953520..475f2c496890c75ece60f89716bf69af7f4a2b47 100644 (file)
@@ -906,9 +906,18 @@ return string_sprintf("%s/%s/%s/%s/%s%s",
 
 static inline uschar *
 spool_fname(const uschar * purpose, const uschar * subdir, const uschar * fname,
-               const uschar * suffix)
+       const uschar * suffix)
 {
+#ifdef COMPILE_UTILITY         /* version avoiding string-extension */
+int len = Ustrlen(spool_directory) + 1 + Ustrlen(queue_name) + 1 + Ustrlen(purpose) + 1
+       + Ustrlen(subdir) + 1 + Ustrlen(fname) + Ustrlen(suffix) + 1;
+uschar * buf = store_get(len, FALSE);
+string_format(buf, len, "%s/%s/%s/%s/%s%s",
+       spool_directory, queue_name, purpose, subdir, fname, suffix);
+return buf;
+#else
 return spool_q_fname(purpose, queue_name, subdir, fname, suffix);
+#endif
 }
 
 static inline void
index 97d71d3a4d157bbec1cb0d6daf5c10f01e409d2b..fbdc0246d48f591f09a3952801f6b274870a9a0a 100644 (file)
@@ -678,12 +678,20 @@ Returns:    pointer to fresh piece of store containing sprintf'ed string
 uschar *
 string_sprintf_trc(const char *format, const uschar * func, unsigned line, ...)
 {
-gstring * g;
-va_list ap;
+#ifdef COMPILE_UTILITY
+uschar buffer[STRING_SPRINTF_BUFFER_SIZE];
+gstring gs = { .size = STRING_SPRINTF_BUFFER_SIZE, .ptr = 0, .s = buffer };
+gstring * g = &gs;
+unsigned flags = 0;
+#else
+gstring * g = NULL;
+unsigned flags = SVFMT_REBUFFER|SVFMT_EXTEND;
+#endif
 
+va_list ap;
 va_start(ap, line);
-g = string_vformat_trc(NULL, func, line, STRING_SPRINTF_BUFFER_SIZE,
-       SVFMT_REBUFFER|SVFMT_EXTEND, format, ap);
+g = string_vformat_trc(g, func, line, STRING_SPRINTF_BUFFER_SIZE,
+       flags, format, ap);
 va_end(ap);
 
 if (!g)
@@ -692,8 +700,12 @@ if (!g)
     " called from %s %d\n",
     STRING_SPRINTF_BUFFER_SIZE, format, func, line);
 
+#ifdef COMPILE_UTILITY
+return string_copyn(g->s, g->ptr);
+#else
 gstring_release_unused(g);
 return string_from_gstring(g);
+#endif
 }