From 22a346a7e4314788bdaa54f930c5b6737d598cd2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 22 Jul 2002 23:10:00 +0000 Subject: Check to make sure the script output is valid UTF-8, if not then attempt 2002-07-22 Jeffrey Stedfast * mail-config.c (mail_config_signature_run_script): Check to make sure the script output is valid UTF-8, if not then attempt to convert it into UTF-8. Fixes bug #28086. svn path=/trunk/; revision=17536 --- mail/ChangeLog | 6 +++++ mail/mail-config.c | 70 ++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 18 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 819301769a..18b383cc3d 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,9 @@ +2002-07-22 Jeffrey Stedfast + + * mail-config.c (mail_config_signature_run_script): Check to make + sure the script output is valid UTF-8, if not then attempt to + convert it into UTF-8. Fixes bug #28086. + 2002-07-22 Not Zed * message-list.c (regen_list_regened): Remove the assert, and diff --git a/mail/mail-config.c b/mail/mail-config.c index 0cef4dc0fa..9e639ee2a5 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -2921,7 +2921,7 @@ mail_config_signature_run_script (gchar *script) if (!(pid = fork ())) { /* child process */ int maxfd, i; - + close (in_fds [0]); if (dup2 (in_fds[1], STDOUT_FILENO) < 0) _exit (255); @@ -2945,22 +2945,59 @@ mail_config_signature_run_script (gchar *script) g_warning ("Failed to create create child process '%s': %s", script, g_strerror (errno)); return NULL; } else { -#define BUFFER_SIZE 4096 - GString *str = g_string_new (NULL); - gchar *rv; - gchar buffer [BUFFER_SIZE]; - ssize_t rb; - + CamelStreamFilter *filtered_stream; + CamelStreamMem *memstream; + CamelMimeFilter *charenc; + CamelStream *stream; + GByteArray *buffer; + const char *charset; + char *content; + /* parent process */ close (in_fds[1]); - while ((rb = read (in_fds [0], buffer, BUFFER_SIZE - 1)) > 0) { - buffer [rb] = 0; - g_string_append (str, buffer); + + stream = camel_stream_fs_new_with_fd (in_fds[0]); + + memstream = (CamelStreamMem *) camel_stream_mem_new (); + buffer = g_byte_array_new (); + camel_stream_mem_set_byte_array (memstream, buffer); + + camel_stream_write_to_stream (stream, (CamelStream *) memstream); + camel_object_unref (stream); + + /* signature scripts are supposed to generate UTF-8 content, but because users + are known to not ever read the manual... we try to do our best if the + content isn't valid UTF-8 by assuming that the content is in the user's + preferred charset. */ + if (!g_utf8_validate (buffer->data, buffer->len, NULL)) { + stream = (CamelStream *) memstream; + memstream = (CamelStreamMem *) camel_stream_mem_new (); + camel_stream_mem_set_byte_array (memstream, g_byte_array_new ()); + + filtered_stream = camel_stream_filter_new_with_stream (stream); + camel_object_unref (stream); + + charset = mail_config_get_default_charset (); + charenc = (CamelMimeFilter *) camel_mime_filter_charset_new_convert (charset, "utf-8"); + camel_stream_filter_add (filtered_stream, charenc); + camel_object_unref (charenc); + + camel_stream_write_to_stream ((CamelStream *) filtered_stream, (CamelStream *) memstream); + camel_object_unref (filtered_stream); + g_byte_array_free (buffer, TRUE); + + buffer = memstream->buffer; } - - close (in_fds [0]); + + camel_object_unref (memstream); + + g_byte_array_append (buffer, "", 1); + content = buffer->data; + g_byte_array_free (buffer, FALSE); + + /* wait for the script process to terminate */ result = waitpid (pid, &status, 0); - + if (result == -1 && errno == EINTR) { /* child process is hanging... */ kill (pid, SIGTERM); @@ -2973,11 +3010,8 @@ mail_config_signature_run_script (gchar *script) result = waitpid (pid, &status, WNOHANG); } } - - rv = str->str; - g_string_free (str, FALSE); - - return rv; + + return content; } } -- cgit v1.2.3