1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-02 22:38:02 +02:00

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>
This commit is contained in:
Neal H. Walfield 2015-11-23 22:13:56 +01:00
parent b75e1b3d8b
commit 5b84b0d660
4 changed files with 22 additions and 8 deletions

View File

@ -221,7 +221,7 @@ check_passphrase_constraints (ctrl_t ctrl, const char *pw,
/* Now check the constraints and collect the error messages unless /* Now check the constraints and collect the error messages unless
in in silent mode which returns immediately. */ in in silent mode which returns immediately. */
if (utf8_charcount (pw) < minlen ) if (utf8_charcount (pw, -1) < minlen )
{ {
if (!failed_constraint) if (!failed_constraint)
{ {

View File

@ -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 /* Given a string containing an UTF-8 encoded text, return the number
of characters in this string. It differs from strlen in that it of characters in this string. It differs from strlen in that it
only counts complete UTF-8 characters. Note, that this function only counts complete UTF-8 characters. SIZE is the maximum length
does not take combined characters into account. */ 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 size_t
utf8_charcount (const char *s) utf8_charcount (const char *s, int len)
{ {
size_t n; size_t n;
if (len == 0)
return 0;
for (n=0; *s; s++) 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; return n;
} }

View File

@ -64,7 +64,7 @@ int hextobyte (const char *s);
char *sanitize_buffer (const void *p, size_t n, int delim); 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 #ifdef HAVE_W32_SYSTEM

View File

@ -1043,7 +1043,7 @@ build_list (const char *text, char letter,
if (maybe_setuid) if (maybe_setuid)
gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */ gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */
indent = utf8_charcount (text); indent = utf8_charcount (text, -1);
len = 0; len = 0;
init_membuf (&mb, 512); init_membuf (&mb, 512);