New function to get the UTF-8 version of the diagnostics (if the locale
2003-04-09 Jeffrey Stedfast <fejj@ximian.com> * camel-gpg-context.c (gpg_ctx_get_utf8_diagnostics): New function to get the UTF-8 version of the diagnostics (if the locale isn't already UTF-8 safe). (gpg_verify): Use the utf-8 diagnostics here. Also fixed a memleak in the exception case. svn path=/trunk/; revision=20792
This commit is contained in:
committed by
Jeffrey Stedfast
parent
891b85f5e0
commit
bcfbad5e31
@ -1,5 +1,11 @@
|
||||
2003-04-09 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* camel-gpg-context.c (gpg_ctx_get_utf8_diagnostics): New function
|
||||
to get the UTF-8 version of the diagnostics (if the locale isn't
|
||||
already UTF-8 safe).
|
||||
(gpg_verify): Use the utf-8 diagnostics here. Also fixed a memleak
|
||||
in the exception case.
|
||||
|
||||
* camel-mime-filter-charset.c
|
||||
(camel_mime_filter_charset_new_convert): NULL-protect the to/from
|
||||
charsets in the g_warning call.
|
||||
|
||||
@ -41,6 +41,8 @@
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "gal/util/e-iconv.h"
|
||||
|
||||
#include "camel-gpg-context.h"
|
||||
#include "camel-stream-fs.h"
|
||||
#include "camel-operation.h"
|
||||
@ -404,6 +406,78 @@ gpg_ctx_get_diagnostics (struct _GpgCtx *gpg)
|
||||
return g_strndup (gpg->diagnostics->data, gpg->diagnostics->len);
|
||||
}
|
||||
|
||||
static char *
|
||||
gpg_ctx_get_utf8_diagnostics (struct _GpgCtx *gpg)
|
||||
{
|
||||
size_t inleft, outleft, converted = 0;
|
||||
const char *charset;
|
||||
char *out, *outbuf;
|
||||
const char *inbuf;
|
||||
size_t outlen;
|
||||
iconv_t cd;
|
||||
|
||||
if (gpg->diagnostics->len == 0)
|
||||
return NULL;
|
||||
|
||||
/* if the locale is C/POSIX/ASCII/UTF-8 - then there's nothing to do here */
|
||||
if (!(charset = e_iconv_locale_charset ()) || !strcasecmp (charset, "UTF-8"))
|
||||
return gpg_ctx_get_diagnostics (gpg);
|
||||
|
||||
cd = e_iconv_open ("UTF-8", charset);
|
||||
|
||||
inbuf = gpg->diagnostics->data;
|
||||
inleft = gpg->diagnostics->len;
|
||||
|
||||
outlen = (inleft * 2) + 16;
|
||||
out = g_malloc (outlen + 1);
|
||||
|
||||
do {
|
||||
outbuf = out + converted;
|
||||
outleft = outlen - converted;
|
||||
|
||||
converted = e_iconv (cd, &inbuf, &inleft, &outbuf, &outleft);
|
||||
if (converted == (size_t) -1) {
|
||||
if (errno != E2BIG && errno != EINVAL)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* E2BIG There is not sufficient room at *outbuf.
|
||||
*
|
||||
* We just need to grow our outbuffer and try again.
|
||||
*/
|
||||
|
||||
converted = outbuf - out;
|
||||
if (errno == E2BIG) {
|
||||
outlen += inleft * 2 + 16;
|
||||
out = g_realloc (out, outlen + 1);
|
||||
outbuf = out + converted;
|
||||
}
|
||||
} while (errno == E2BIG && inleft > 0);
|
||||
|
||||
/*
|
||||
* EINVAL An incomplete multibyte sequence has been encoun
|
||||
* tered in the input.
|
||||
*
|
||||
* We'll just have to ignore it...
|
||||
*/
|
||||
|
||||
/* flush the iconv conversion */
|
||||
e_iconv (cd, NULL, NULL, &outbuf, &outleft);
|
||||
e_iconv_close (cd);
|
||||
|
||||
/* nul-terminate the string */
|
||||
outbuf[0] = '\0';
|
||||
|
||||
return out;
|
||||
|
||||
fail:
|
||||
|
||||
g_free (out);
|
||||
|
||||
return gpg_ctx_get_diagnostics (gpg);
|
||||
}
|
||||
|
||||
static void
|
||||
userid_hint_free (gpointer key, gpointer value, gpointer user_data)
|
||||
{
|
||||
@ -1364,7 +1438,7 @@ gpg_verify (CamelCipherContext *context, CamelCipherHash hash,
|
||||
}
|
||||
}
|
||||
|
||||
diagnostics = gpg_ctx_get_diagnostics (gpg);
|
||||
diagnostics = gpg_ctx_get_utf8_diagnostics (gpg);
|
||||
|
||||
valid = gpg_ctx_op_wait (gpg) == 0;
|
||||
gpg_ctx_free (gpg);
|
||||
@ -1383,8 +1457,6 @@ gpg_verify (CamelCipherContext *context, CamelCipherHash hash,
|
||||
|
||||
exception:
|
||||
|
||||
diagnostics = gpg_ctx_get_diagnostics (gpg);
|
||||
|
||||
gpg_ctx_free (gpg);
|
||||
|
||||
if (sigfile) {
|
||||
|
||||
Reference in New Issue
Block a user