From ac0bbb760570434dea1e86de4756175d2869ed02 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Mon, 14 May 2001 14:53:59 +0000 Subject: [PATCH] Avoid using stderr to be as robust as possible in out-of-memory. Thu May 10 23:21:30 2001 Owen Taylor * gmessages.c (g_log_write_prefix): Avoid using stderr to be as robust as possible in out-of-memory. * gmessages.c (g_log_default_handler): Remove some dead code. * gutils.c (g_parse_debug_string): Fix to avoid mallocs. --- ChangeLog | 10 +++++++ ChangeLog.pre-2-0 | 10 +++++++ ChangeLog.pre-2-10 | 10 +++++++ ChangeLog.pre-2-12 | 10 +++++++ ChangeLog.pre-2-2 | 10 +++++++ ChangeLog.pre-2-4 | 10 +++++++ ChangeLog.pre-2-6 | 10 +++++++ ChangeLog.pre-2-8 | 10 +++++++ glib/gmessages.c | 81 ++++++++++++++++++++++++++++++++++++++++++------------ glib/gutils.c | 14 ++++------ gmessages.c | 81 ++++++++++++++++++++++++++++++++++++++++++------------ gutils.c | 14 ++++------ 12 files changed, 216 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0db0474..dd54851 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 0db0474..dd54851 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stderr + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + Fri May 11 18:25:23 2001 Tim Janik * gdataset.c: diff --git a/glib/gmessages.c b/glib/gmessages.c index 3a4aa33..6db1933 100644 --- a/glib/gmessages.c +++ b/glib/gmessages.c @@ -151,6 +151,59 @@ ensure_stdout_valid (void) #endif static void +write_unsigned (gint fd, + gulong num, + guint radix) +{ + char buffer[64]; + gulong tmp; + char c; + int i, n; + + g_return_if_fail (radix >= 2 && radix <= 36); + + if (!num) + { + write (fd, "0", 1); + return; + } + + if (radix == 16) + write (fd, "0x", 2); + else if (radix == 8) + write (fd, "0", 1); + + n = 0; + tmp = num; + while (tmp) + { + tmp /= radix; + n++; + } + + i = n; + while (num) + { + i--; + c = (num % radix); + if (c < 10) + buffer[i] = c + '0'; + else + buffer[i] = c + 'a' - 10; + num /= radix; + } + + write (fd, buffer, n); +} + +static void +write_string (gint fd, + gchar *string) +{ + write (fd, string, strlen (string)); +} + +static void g_log_write_prefix (gint fd, GLogLevelFlags mask) { @@ -185,20 +238,20 @@ g_log_write_prefix (gint fd, if ((g_log_msg_prefix & mask) == mask) { - gchar prg_pid[64], *prg_name; + gchar *prg_name; prg_name = g_get_prgname (); - + if (!prg_name) - { - prg_name = "(process"; - sprintf (prg_pid, ":%u): ", getpid ()); - } + write_string (fd, "(process:"); else - sprintf (prg_pid, " (pid:%u): ", getpid ()); - - write (fd, prg_name, strlen (prg_name)); - write (fd, prg_pid, strlen (prg_pid)); + { + write_string (fd, prg_name); + write_string (fd, " (pid:"); + } + + write_unsigned (fd, getpid (), 10); + write_string (fd, "): "); } } @@ -530,7 +583,6 @@ g_log_default_handler (const gchar *log_domain, GErrorFunc local_glib_error_func; GWarningFunc local_glib_warning_func; GPrintFunc local_glib_message_func; - gchar prg_pid[64], *prg_name = g_get_prgname (); in_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0; is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; @@ -538,13 +590,6 @@ g_log_default_handler (const gchar *log_domain, if (!message) message = "g_log_default_handler(): (NULL) message"; - if (!prg_name) - { - prg_name = "(process"; - sprintf (prg_pid, ":%u): ", getpid ()); - } - else - sprintf (prg_pid, " (pid:%u): ", getpid ()); #ifdef G_OS_WIN32 /* Use just stdout as stderr is hard to get redirected from the diff --git a/glib/gutils.c b/glib/gutils.c index f00262c..ac53d2b 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -437,9 +437,8 @@ g_parse_debug_string (const gchar *string, } else { - gchar *str = g_strdup (string); - gchar *p = str; - gchar *q; + const gchar *p = string; + const gchar *q; gboolean done = FALSE; while (*p && !done) @@ -451,16 +450,13 @@ g_parse_debug_string (const gchar *string, done = TRUE; } - *q = 0; - for (i=0; i= 2 && radix <= 36); + + if (!num) + { + write (fd, "0", 1); + return; + } + + if (radix == 16) + write (fd, "0x", 2); + else if (radix == 8) + write (fd, "0", 1); + + n = 0; + tmp = num; + while (tmp) + { + tmp /= radix; + n++; + } + + i = n; + while (num) + { + i--; + c = (num % radix); + if (c < 10) + buffer[i] = c + '0'; + else + buffer[i] = c + 'a' - 10; + num /= radix; + } + + write (fd, buffer, n); +} + +static void +write_string (gint fd, + gchar *string) +{ + write (fd, string, strlen (string)); +} + +static void g_log_write_prefix (gint fd, GLogLevelFlags mask) { @@ -185,20 +238,20 @@ g_log_write_prefix (gint fd, if ((g_log_msg_prefix & mask) == mask) { - gchar prg_pid[64], *prg_name; + gchar *prg_name; prg_name = g_get_prgname (); - + if (!prg_name) - { - prg_name = "(process"; - sprintf (prg_pid, ":%u): ", getpid ()); - } + write_string (fd, "(process:"); else - sprintf (prg_pid, " (pid:%u): ", getpid ()); - - write (fd, prg_name, strlen (prg_name)); - write (fd, prg_pid, strlen (prg_pid)); + { + write_string (fd, prg_name); + write_string (fd, " (pid:"); + } + + write_unsigned (fd, getpid (), 10); + write_string (fd, "): "); } } @@ -530,7 +583,6 @@ g_log_default_handler (const gchar *log_domain, GErrorFunc local_glib_error_func; GWarningFunc local_glib_warning_func; GPrintFunc local_glib_message_func; - gchar prg_pid[64], *prg_name = g_get_prgname (); in_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0; is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; @@ -538,13 +590,6 @@ g_log_default_handler (const gchar *log_domain, if (!message) message = "g_log_default_handler(): (NULL) message"; - if (!prg_name) - { - prg_name = "(process"; - sprintf (prg_pid, ":%u): ", getpid ()); - } - else - sprintf (prg_pid, " (pid:%u): ", getpid ()); #ifdef G_OS_WIN32 /* Use just stdout as stderr is hard to get redirected from the diff --git a/gutils.c b/gutils.c index f00262c..ac53d2b 100644 --- a/gutils.c +++ b/gutils.c @@ -437,9 +437,8 @@ g_parse_debug_string (const gchar *string, } else { - gchar *str = g_strdup (string); - gchar *p = str; - gchar *q; + const gchar *p = string; + const gchar *q; gboolean done = FALSE; while (*p && !done) @@ -451,16 +450,13 @@ g_parse_debug_string (const gchar *string, done = TRUE; } - *q = 0; - for (i=0; i