diff --git a/mapstring.cpp b/mapstring.cpp index 4f34aa099e..0fc5488fad 100644 --- a/mapstring.cpp +++ b/mapstring.cpp @@ -1691,13 +1691,25 @@ char *msGetFriBidiEncodedString(const char *string, const char *encoding) FriBidiLevel *levels; FriBidiStrIndex new_len; fribidi_boolean log2vis; - int i, j; visual = (FriBidiChar *) msSmallMalloc (sizeof (FriBidiChar) * (len + 1)); ltov = NULL; vtol = NULL; levels = NULL; + // fribidi_log2vis() doesn't support multi-line paragraphs. + // See: https://lists.freedesktop.org/archives/fribidi/2008-January/000515.html + for( size_t i = 0; i < len; i++ ) + { + if (logical[i] == '\n') { + msSetError(MS_IDENTERR, + "Input string is a multi-line paragraph, which is not supported.", + "msGetFriBidiEncodedString()"); + msFree(visual); + return NULL; + } + } + /* Create a bidi string. */ log2vis = fribidi_log2vis (logical, len, &base, /* output */ @@ -1706,6 +1718,7 @@ char *msGetFriBidiEncodedString(const char *string, const char *encoding) if (!log2vis) { msSetError(MS_IDENTERR, "Failed to create bidi string.", "msGetFriBidiEncodedString()"); + msFree(visual); return NULL; } @@ -1728,7 +1741,8 @@ char *msGetFriBidiEncodedString(const char *string, const char *encoding) /* scan str and compress out FRIBIDI_CHAR_FILL UTF8 characters */ - for (i=0, j=0; i