aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2008-10-23 10:51:31 +0000
committerMarcus Brinkmann <[email protected]>2008-10-23 10:51:31 +0000
commit69b1a65fb8138a46db6b006c54a10ceb942549df (patch)
treeb9285e6a151512bf72aa6b61b7c9c5778f8a47de
parentFix bug #818. (diff)
downloadgpgme-69b1a65fb8138a46db6b006c54a10ceb942549df.tar.gz
gpgme-69b1a65fb8138a46db6b006c54a10ceb942549df.zip
2008-10-23 Marcus Brinkmann <[email protected]>
* rungpg.c (gpg_keylist_preprocess): Convert percent escaped string to C coded string.
-rw-r--r--gpgme/ChangeLog5
-rw-r--r--gpgme/rungpg.c43
2 files changed, 44 insertions, 4 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog
index 27399528..e9d8675e 100644
--- a/gpgme/ChangeLog
+++ b/gpgme/ChangeLog
@@ -1,3 +1,8 @@
+2008-10-23 Marcus Brinkmann <[email protected]>
+
+ * rungpg.c (gpg_keylist_preprocess): Convert percent escaped
+ string to C coded string.
+
2008-10-20 Werner Koch <[email protected]>
* Makefile.am (EXTRA_DIST): Add gpgme.h.in.
diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c
index 76bcaaed..7524d68f 100644
--- a/gpgme/rungpg.c
+++ b/gpgme/rungpg.c
@@ -1878,12 +1878,47 @@ gpg_keylist_preprocess (char *line, char **r_line)
HTTP Keyserver Protocol (draft).
We want:
- uid:o<flags>::::<creatdate>:<expdate>:::<uid>:
+ uid:o<flags>::::<creatdate>:<expdate>:::<c-coded uid>:
*/
- if (asprintf (r_line, "uid:o%s::::%s:%s:::%s:",
- field[4], field[2], field[3], field[1]) < 0)
- return gpg_error_from_errno (errno);
+ {
+ /* The user ID is percent escaped, but we want c-coded.
+ Because we have to replace each '%HL' by '\xHL', we need at
+ most 4/3 th the number of bytes. But because this
+ security software, we err on the good side and allocate
+ twice as much. */
+ char *uid = malloc (2 * strlen (field[1]) + 1);
+ char *src;
+ char *dst;
+
+ if (! uid)
+ return gpg_error_from_errno (errno);
+ src = field[1];
+ dst = uid;
+ while (*src)
+ {
+ if (*src == '%')
+ {
+ *(dst++) = '\\';
+ *(dst++) = 'x';
+ src++;
+ /* Copy the next two bytes unconditionally. This is
+ what reduces the maximum number of needed bytes
+ from 2n+1 to (4/3)n+1, even for invalid strings. */
+ if (*src)
+ *(dst++) = *(src++);
+ if (*src)
+ *(dst++) = *(src++);
+ }
+ else
+ *(dst++) = *(src++);
+ }
+ *dst = '\0';
+
+ if (asprintf (r_line, "uid:o%s::::%s:%s:::%s:",
+ field[4], field[2], field[3], uid) < 0)
+ return gpg_error_from_errno (errno);
+ }
return 0;
case RT_NONE: