Module Name: src Committed By: christos Date: Sun Nov 25 16:20:28 UTC 2018
Modified Files: src/lib/libedit: chartype.c Log Message: >From Yuichiro Naito (FreeBSD): hrs@ says that wctomb(3) has an internal shift state, if wctomb(3) is called outside of libedit, the internal state can be changed and causes miscalculate multibyte size. So in this part, wcrtomb(3) should be used. wcrtomb(3) requires that shift state is given in the argument. We always initialize the shift state in ct_enc_width() to keep independent from outside of libedit. To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 src/lib/libedit/chartype.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libedit/chartype.c diff -u src/lib/libedit/chartype.c:1.33 src/lib/libedit/chartype.c:1.34 --- src/lib/libedit/chartype.c:1.33 Sun Nov 18 12:15:41 2018 +++ src/lib/libedit/chartype.c Sun Nov 25 11:20:28 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: chartype.c,v 1.33 2018/11/18 17:15:41 christos Exp $ */ +/* $NetBSD: chartype.c,v 1.34 2018/11/25 16:20:28 christos Exp $ */ /*- * Copyright (c) 2009 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include "config.h" #if !defined(lint) && !defined(SCCSID) -__RCSID("$NetBSD: chartype.c,v 1.33 2018/11/18 17:15:41 christos Exp $"); +__RCSID("$NetBSD: chartype.c,v 1.34 2018/11/25 16:20:28 christos Exp $"); #endif /* not lint && not SCCSID */ #include <ctype.h> @@ -184,11 +184,14 @@ ct_decode_argv(int argc, const char *arg libedit_private size_t ct_enc_width(wchar_t c) { + mbstate_t mbs; char buf[MB_LEN_MAX]; - int size; - if ((size = wctomb(buf, c)) < 0) + size_t size; + memset(&mbs, 0, sizeof(mbs)); + + if ((size = wcrtomb(buf, c, &mbs)) == (size_t)-1) return 0; - return (size_t)size; + return size; } libedit_private ssize_t