[PATCH] Fixed potential, rare corruption of unicode characters

Dirk Hohndel dirk at hohndel.org
Tue Oct 2 10:09:18 PDT 2012


I wonder if there are other spots where we do similar things (of
assuming ascii characters). Would you have the time to do a quick scan
of our use of strlen and friends in places where we could have UTF-8
strings?

Thanks

/D

"Lubomir I. Ivanov" <neolit123 at gmail.com> writes:

> From: "Lubomir I. Ivanov" <neolit123 at gmail.com>
>
> In divelist.c:get_string(), when truncating the string to a maximum
> of 60 characters (to be shown in the divelist), make sure we are
> counting in guinchar (sizeof usually 2) instead of gchar (sizeof usually 1).
> Use Glib functions such as g_utf8_strlen() and g_utf8_strncpy() to do that.
>
> This patch fixes the potential problem when truncating a UTF-8 string
> by calculating its length using strlen() in bytes.
>
> For char = 1 byte, if the length returned by strlen() is an odd number
> this means there is at least one single byte length character in there.
>
> But also if the same string has a UTF-8 character at exactly the truncate
> position minus x(probably 1) bytes, we are going to split the bytes
> forming said UTF-8 char resulting in an incorrect string.
>
> Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
> ---
>  divelist.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/divelist.c b/divelist.c
> index e09eca5..910b0c9 100644
> --- a/divelist.c
> +++ b/divelist.c
> @@ -788,12 +788,11 @@ static void get_string(char **str, const char *s)
>  
>  	if (!s)
>  		s = "";
> -	len = strlen(s);
> +	len = g_utf8_strlen(s, -1);
>  	if (len > 60)
>  		len = 60;
> -	n = malloc(len+1);
> -	memcpy(n, s, len);
> -	n[len] = 0;
> +	n = malloc(len * sizeof(gunichar) + 1);
> +	g_utf8_strncpy(n, s, len);
>  	*str = n;
>  }
>  
> -- 
> 1.7.11.msysgit.0
>
> _______________________________________________
> subsurface mailing list
> subsurface at hohndel.org
> http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface

-- 
Dirk Hohndel
Intel Open Source Technology Center


More information about the subsurface mailing list