summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@g10code.com>2015-11-23 22:13:56 +0100
committerNeal H. Walfield <neal@g10code.com>2015-11-23 22:23:37 +0100
commit5b84b0d660c8329e184d98682665aaea7e1703d2 (patch)
tree7eb86d1423780c332b27daa9226e1144e451bcb3
parentdirmngr: Fix http lookups when libadns is used. (diff)
downloadgnupg2-5b84b0d660c8329e184d98682665aaea7e1703d2.tar.xz
gnupg2-5b84b0d660c8329e184d98682665aaea7e1703d2.zip
common: Extend utf8_charcount to include the string's length.
* common/stringhelp.c (utf8_charcount): Take additional parameter, len. Process at most LEN bytes. -- Signed-off-by: Neal H. Walfield <neal@g10code.com>
-rw-r--r--agent/genkey.c2
-rw-r--r--common/stringhelp.c24
-rw-r--r--common/stringhelp.h2
-rw-r--r--g10/gpg.c2
4 files changed, 22 insertions, 8 deletions
diff --git a/agent/genkey.c b/agent/genkey.c
index b780c5049..2eec974d3 100644
--- a/agent/genkey.c
+++ b/agent/genkey.c
@@ -221,7 +221,7 @@ check_passphrase_constraints (ctrl_t ctrl, const char *pw,
/* Now check the constraints and collect the error messages unless
in in silent mode which returns immediately. */
- if (utf8_charcount (pw) < minlen )
+ if (utf8_charcount (pw, -1) < minlen )
{
if (!failed_constraint)
{
diff --git a/common/stringhelp.c b/common/stringhelp.c
index 38c383212..d0b55615d 100644
--- a/common/stringhelp.c
+++ b/common/stringhelp.c
@@ -746,16 +746,30 @@ sanitize_buffer (const void *p_arg, size_t n, int delim)
/* Given a string containing an UTF-8 encoded text, return the number
of characters in this string. It differs from strlen in that it
- only counts complete UTF-8 characters. Note, that this function
- does not take combined characters into account. */
+ only counts complete UTF-8 characters. SIZE is the maximum length
+ of the string in bytes. If SIZE is -1, then a NUL character is
+ taken to be the end of the string. Note, that this function does
+ not take combined characters into account. */
size_t
-utf8_charcount (const char *s)
+utf8_charcount (const char *s, int len)
{
size_t n;
+ if (len == 0)
+ return 0;
+
for (n=0; *s; s++)
- if ( (*s&0xc0) != 0x80 ) /* Exclude continuation bytes: 10xxxxxx */
- n++;
+ {
+ if ( (*s&0xc0) != 0x80 ) /* Exclude continuation bytes: 10xxxxxx */
+ n++;
+
+ if (len != -1)
+ {
+ len --;
+ if (len == 0)
+ break;
+ }
+ }
return n;
}
diff --git a/common/stringhelp.h b/common/stringhelp.h
index a84c81b3f..b34d28b89 100644
--- a/common/stringhelp.h
+++ b/common/stringhelp.h
@@ -64,7 +64,7 @@ int hextobyte (const char *s);
char *sanitize_buffer (const void *p, size_t n, int delim);
-size_t utf8_charcount (const char *s);
+size_t utf8_charcount (const char *s, int len);
#ifdef HAVE_W32_SYSTEM
diff --git a/g10/gpg.c b/g10/gpg.c
index 5ba3a205c..5c5afa690 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1043,7 +1043,7 @@ build_list (const char *text, char letter,
if (maybe_setuid)
gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */
- indent = utf8_charcount (text);
+ indent = utf8_charcount (text, -1);
len = 0;
init_membuf (&mb, 512);