diff options
author | NIIBE Yutaka <[email protected]> | 2018-07-12 08:09:14 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2018-07-12 08:09:14 +0000 |
commit | e8caa282d3d5f286919a1ed3db6699c555b7e89d (patch) | |
tree | 1762014bacef69c542923f55dfe83a2f925d7999 /common/percent.c | |
parent | g10: Fix enum_secret_keys for card keys. (diff) | |
parent | gpg: Remove multiple subkey bindings during export-clean. (diff) | |
download | gnupg-gniibe/decryption-key.tar.gz gnupg-gniibe/decryption-key.zip |
Merge branch 'master' into gniibe/decryption-keygniibe/decryption-key
Diffstat (limited to 'common/percent.c')
-rw-r--r-- | common/percent.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/common/percent.c b/common/percent.c index 569c5fd99..eeb026fbe 100644 --- a/common/percent.c +++ b/common/percent.c @@ -87,6 +87,50 @@ percent_plus_escape (const char *string) } +/* Create a newly alloced string from (DATA,DATALEN) with embedded + * Nuls quoted as %00. The standard percent unescaping can be + * used to reverse this encoding. */ +char * +percent_data_escape (const void *data, size_t datalen) +{ + char *buffer, *p; + const char *s; + size_t n, length; + + for (length=1, s=data, n=datalen; n; s++, n--) + { + if (!*s || *s == '%') + length += 3; + else + length++; + } + + buffer = p = xtrymalloc (length); + if (!buffer) + return NULL; + + for (s=data, n=datalen; n; s++, n--) + { + if (!*s) + { + memcpy (p, "%00", 3); + p += 3; + } + else if (*s == '%') + { + memcpy (p, "%25", 3); + p += 3; + } + else + *p++ = *s; + } + *p = 0; + + return buffer; + +} + + /* Do the percent and plus/space unescaping from STRING to BUFFER and return the length of the valid buffer. Plus unescaping is only done if WITHPLUS is true. An escaped Nul character will be |