mirror of git://git.sv.gnu.org/nano.git
in (control_)?mbrep(), if crep is an invalid multibyte sequence, copy
Unicode 0xFFFD (Replacement Character) into it using strncpy() instead of assigning the former to it; this avoids segfaults when freeing crep later, since it's supposed to be dynamically allocated git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3018 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
parent
1c3bfa9f2b
commit
3c4dc46fdc
|
@ -170,6 +170,11 @@ CVS code -
|
||||||
control_rep(), control_mbrep()
|
control_rep(), control_mbrep()
|
||||||
- Assert that the multibyte character passed in is a control
|
- Assert that the multibyte character passed in is a control
|
||||||
character if it's valid. (DLR)
|
character if it's valid. (DLR)
|
||||||
|
- If crep is an invalid multibyte sequence, copy Unicode 0xFFFD
|
||||||
|
(Replacement Character) into it using strncpy() instead of
|
||||||
|
assigning the former to it. This avoids segfaults when freeing
|
||||||
|
crep later, since it's supposed to be dynamically allocated.
|
||||||
|
(DLR)
|
||||||
mbrep()
|
mbrep()
|
||||||
- New function, the equivalent of control_mbrep() for non-control
|
- New function, the equivalent of control_mbrep() for non-control
|
||||||
characters. (DLR)
|
characters. (DLR)
|
||||||
|
|
14
src/chars.c
14
src/chars.c
|
@ -213,7 +213,10 @@ wchar_t control_wrep(wchar_t wc)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* c is a multibyte control character. It displays as ^@, ^?, or ^[ch],
|
/* c is a multibyte control character. It displays as ^@, ^?, or ^[ch],
|
||||||
* where ch is (c + 64). We return that multibyte character. */
|
* where ch is (c + 64). We return that multibyte character. If crep
|
||||||
|
* is an invalid multibyte sequence, it will be replaced with Unicode
|
||||||
|
* 0xFFFD (Replacement Character), so it should be dynamically allocated
|
||||||
|
* and able to hold MB_CUR_MAX single-byte characters. */
|
||||||
char *control_mbrep(const char *c, char *crep, int *crep_len)
|
char *control_mbrep(const char *c, char *crep, int *crep_len)
|
||||||
{
|
{
|
||||||
assert(c != NULL && crep != NULL && crep_len != NULL);
|
assert(c != NULL && crep != NULL && crep_len != NULL);
|
||||||
|
@ -224,8 +227,8 @@ char *control_mbrep(const char *c, char *crep, int *crep_len)
|
||||||
|
|
||||||
if (mbtowc(&wc, c, MB_CUR_MAX) < 0) {
|
if (mbtowc(&wc, c, MB_CUR_MAX) < 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
crep = (char *)bad_mbchar;
|
|
||||||
*crep_len = bad_mbchar_len;
|
*crep_len = bad_mbchar_len;
|
||||||
|
strncpy(crep, bad_mbchar, *crep_len);
|
||||||
} else {
|
} else {
|
||||||
*crep_len = wctomb(crep, control_wrep(wc));
|
*crep_len = wctomb(crep, control_wrep(wc));
|
||||||
|
|
||||||
|
@ -246,7 +249,10 @@ char *control_mbrep(const char *c, char *crep, int *crep_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* c is a multibyte non-control character. We return that multibyte
|
/* c is a multibyte non-control character. We return that multibyte
|
||||||
* character. */
|
* character. If crep is an invalid multibyte sequence, it will be
|
||||||
|
* replaced with Unicode 0xFFFD (Replacement Character), so it should be
|
||||||
|
* dynamically allocated and able to hold MB_CUR_MAX single-byte
|
||||||
|
* characters. */
|
||||||
char *mbrep(const char *c, char *crep, int *crep_len)
|
char *mbrep(const char *c, char *crep, int *crep_len)
|
||||||
{
|
{
|
||||||
assert(c != NULL && crep != NULL && crep_len != NULL);
|
assert(c != NULL && crep != NULL && crep_len != NULL);
|
||||||
|
@ -258,8 +264,8 @@ char *mbrep(const char *c, char *crep, int *crep_len)
|
||||||
/* Reject invalid Unicode characters. */
|
/* Reject invalid Unicode characters. */
|
||||||
if (mbtowc(&wc, c, MB_CUR_MAX) < 0 || !is_valid_unicode(wc)) {
|
if (mbtowc(&wc, c, MB_CUR_MAX) < 0 || !is_valid_unicode(wc)) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
crep = (char *)bad_mbchar;
|
|
||||||
*crep_len = bad_mbchar_len;
|
*crep_len = bad_mbchar_len;
|
||||||
|
strncpy(crep, bad_mbchar, *crep_len);
|
||||||
} else {
|
} else {
|
||||||
*crep_len = wctomb(crep, wc);
|
*crep_len = wctomb(crep, wc);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue