X-Git-Url: http://git.madism.org/?a=blobdiff_plain;ds=sidebyside;f=pager.c;h=da23902341c41f084375b4e78aa4d4c709840cfe;hb=e01486aabea6f0af36933158bd58b9ab03b30add;hp=9d5444cfde2860da1b2561877d60a17ff281a4b7;hpb=7480539010bab6905c944b11b036492a1a625994;p=apps%2Fmadmutt.git diff --git a/pager.c b/pager.c index 9d5444c..da23902 100644 --- a/pager.c +++ b/pager.c @@ -878,6 +878,24 @@ static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a) return pos; } +/* trim tail of buf so that it contains complete multibyte characters */ +static int trim_incomplete_mbyte(unsigned char *buf, size_t len) { + mbstate_t mbstate; + size_t k; + + memset (&mbstate, 0, sizeof (mbstate)); + for (; len > 0; buf += k, len -= k) { + k = mbrtowc (NULL, (char *) buf, len, &mbstate); + if (k == -2) + break; + else if (k == -1 || k == 0) + k = 1; + } + *buf = '\0'; + + return len; +} + static int fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, unsigned char *fmt, size_t blen, int *buf_ready) @@ -897,6 +915,11 @@ fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, b_read = (int) (*last_pos - offset); *buf_ready = 1; + /* incomplete mbyte characters trigger a segfault in regex processing for + * certain versions of glibc. Trim them if necessary. */ + if (b_read == blen - 2) + b_read -= trim_incomplete_mbyte(buf, b_read); + /* copy "buf" to "fmt", but without bold and underline controls */ p = buf; while (*p) {