summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2020-02-20 08:50:01 +0000
committerSimon McVittie <smcv@collabora.com>2020-02-20 08:50:01 +0000
commitb6fd40cef9aaebeff7f9653c0b7e18f43695d72f (patch)
treea36e4420f3ade2c287012c10e1ce670a7027222a
parent773f136787d035f3cbfed26cceeddc533ecdaa13 (diff)
parentc0aea35e13bfd9a8ecca3825f64d97cfb3e6667e (diff)
downloaddbus-b6fd40cef9aaebeff7f9653c0b7e18f43695d72f.tar.gz
Merge branch 'let-dbus_verbose_real-use-dbus-string' into 'master'
In _dbus_verbose_real() use DBusString instance to avoid possible stack smashing Closes #45 See merge request dbus/dbus!133
-rw-r--r--dbus/dbus-internals.c61
-rw-r--r--dbus/dbus-internals.h1
-rw-r--r--dbus/dbus-memory.c2
3 files changed, 55 insertions, 9 deletions
diff --git a/dbus/dbus-internals.c b/dbus/dbus-internals.c
index 7eb85501..57b8cea7 100644
--- a/dbus/dbus-internals.c
+++ b/dbus/dbus-internals.c
@@ -382,6 +382,30 @@ dbus_bool_t _dbus_get_verbose (void)
}
/**
+ * Low-level function for displaying a string
+ * for the predefined output channel, which
+ * can be the Windows debug output port or stderr.
+ *
+ * This function must be used instead of
+ * dbus_verbose(), if a dynamic memory request
+ * cannot be used to avoid recursive call loops.
+ *
+ * @param s string to display
+ */
+void
+_dbus_verbose_raw (const char *s)
+{
+ if (!_dbus_is_verbose_real ())
+ return;
+#ifdef DBUS_USE_OUTPUT_DEBUG_STRING
+ OutputDebugStringA (s);
+#else
+ fputs (s, stderr);
+ fflush (stderr);
+#endif
+}
+
+/**
* Prints a warning message to stderr
* if the user has enabled verbose mode.
* This is the real function implementation,
@@ -429,16 +453,37 @@ _dbus_verbose_real (
need_pid = FALSE;
va_start (args, format);
+
#ifdef DBUS_USE_OUTPUT_DEBUG_STRING
{
- char buf[1024];
- strcpy(buf,module_name);
+ DBusString out = _DBUS_STRING_INIT_INVALID;
+ const char *message = NULL;
+
+ if (!_dbus_string_init (&out))
+ goto out;
+
+ if (!_dbus_string_append (&out, module_name))
+ goto out;
+
#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
- sprintf (buf+strlen(buf), "[%s(%d):%s] ",_dbus_file_path_extract_elements_from_tail(file,2),line,function);
+ if (!_dbus_string_append_printf (&out, "[%s(%d):%s] ", _dbus_file_path_extract_elements_from_tail (file, 2), line, function))
+ goto out;
#endif
- vsprintf (buf+strlen(buf),format, args);
- va_end (args);
- OutputDebugStringA(buf);
+ if (!_dbus_string_append_printf_valist (&out, format, args))
+ goto out;
+ message = _dbus_string_get_const_data (&out);
+out:
+ if (message == NULL)
+ {
+ OutputDebugStringA ("Out of memory while formatting verbose message: '");
+ OutputDebugStringA (format);
+ OutputDebugStringA ("'");
+ }
+ else
+ {
+ OutputDebugStringA (message);
+ }
+ _dbus_string_free (&out);
}
#else
#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
@@ -446,10 +491,10 @@ _dbus_verbose_real (
#endif
vfprintf (stderr, format, args);
- va_end (args);
-
fflush (stderr);
#endif
+
+ va_end (args);
}
/**
diff --git a/dbus/dbus-internals.h b/dbus/dbus-internals.h
index 94bd7801..73443e23 100644
--- a/dbus/dbus-internals.h
+++ b/dbus/dbus-internals.h
@@ -119,6 +119,7 @@ DBUS_PRIVATE_EXPORT
dbus_bool_t _dbus_get_verbose (void);
DBUS_PRIVATE_EXPORT
void _dbus_set_verbose (dbus_bool_t state);
+void _dbus_verbose_raw (const char *s);
# define _dbus_verbose_reset _dbus_verbose_reset_real
# define _dbus_is_verbose _dbus_is_verbose_real
diff --git a/dbus/dbus-memory.c b/dbus/dbus-memory.c
index 5468561a..96df2357 100644
--- a/dbus/dbus-memory.c
+++ b/dbus/dbus-memory.c
@@ -261,7 +261,7 @@ _dbus_decrement_fail_alloc_counter (void)
if (!called)
{
- _dbus_verbose("TODO: memory allocation testing errors disabled for now\n");
+ _dbus_verbose_raw ("TODO: memory allocation testing errors disabled for now\n");
called = 1;
}
return FALSE;