diff options
-rw-r--r-- | gl/lib/mbsalign.c | 6 | ||||
-rw-r--r-- | gl/tests/test-mbsalign.c | 7 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gl/lib/mbsalign.c b/gl/lib/mbsalign.c index 5b55ec2d0..b92fe8f79 100644 --- a/gl/lib/mbsalign.c +++ b/gl/lib/mbsalign.c @@ -178,6 +178,12 @@ mbsalign (const char *src, char *dest, size_t dest_size, then create a modified copy of it. */ if (wc_enabled && (conversion || (n_cols > *width))) { + if (conversion) + { + /* May have increased the size by converting + \t to \uFFFD for example. */ + src_size = wcstombs (NULL, str_wc, 0) + 1; + } newstr = malloc (src_size); if (newstr == NULL) { diff --git a/gl/tests/test-mbsalign.c b/gl/tests/test-mbsalign.c index 9f8935732..1d894831e 100644 --- a/gl/tests/test-mbsalign.c +++ b/gl/tests/test-mbsalign.c @@ -87,6 +87,13 @@ main (void) width = 4; /* cells */ n = mbsalign ("¹²³", dest, 0, &width, MBS_ALIGN_LEFT, 0); ASSERT (width == 3); + + /* Test case where output is larger than input + (as tab converted to multi byte replacement char). */ + width = 4; + n = mbsalign ("t\tés" /* 6 including NUL */ , dest, sizeof dest, + &width, MBS_ALIGN_LEFT, 0); + ASSERT (n == 7); } return 0; |