lib/fold: Catch error case from mbrtowc()
authorSam Mendoza-Jonas <sam@mendozajonas.com>
Thu, 3 Mar 2016 02:31:18 +0000 (13:31 +1100)
committerSam Mendoza-Jonas <sam@mendozajonas.com>
Tue, 15 Mar 2016 03:34:41 +0000 (14:34 +1100)
The assert() statement in fold_text() only evaluates in a debug build.
If mbrtowc() encounters an error return the portion of the string that
has been parsed and stop.

This avoids an issue with glibc 2.22 where previous calls to
setlocale() failed and set an unsuitable locale. Since the error was not
caught this resulted in an infinite loop when trying to access the
Language screen.

Signed-off-by: Sam Mendoza-Jonas <sam@mendozajonas.com>
lib/fold/fold.c

index 2566253aca8de697149d2c17477eb26ba14b455a..812a324839223df6fd43af74f5549754fb6a0146 100644 (file)
@@ -36,9 +36,10 @@ void fold_text(const char *text,
 
                assert(bytes != (size_t)-1);
 
-               /* we'll get a zero size for the nul terminator, or (size_t) -2
-                * if we've reached the end of the buffer */
-               if (!bytes || bytes == (size_t) -2) {
+               /* we'll get a zero size for the nul terminator, (size_t) -2
+                * if we've reached the end of the buffer, or (size_t) -1 on
+                * error */
+               if (!bytes || bytes == (size_t) -2 || bytes == (size_t) -1) {
                        line_cb(arg, start, end - start);
                        break;
                }