diff options
Diffstat (limited to '0003_copy-data-when-adding-glyph-to-cache.patch')
-rw-r--r-- | 0003_copy-data-when-adding-glyph-to-cache.patch | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/0003_copy-data-when-adding-glyph-to-cache.patch b/0003_copy-data-when-adding-glyph-to-cache.patch new file mode 100644 index 000000000000..8e553f4d112e --- /dev/null +++ b/0003_copy-data-when-adding-glyph-to-cache.patch @@ -0,0 +1,106 @@ +From daea54925b2e8c7606eb22e65ab6b2397306363b Mon Sep 17 00:00:00 2001 +From: Bernhard Miklautz <bmiklautz@thinstuff.at> +Date: Tue, 24 Sep 2013 23:25:18 +0200 +Subject: [PATCH] core/glyph: copy data when adding glyph to cache + +fixes #2439 + +(cherry picked from commit c99d9ee72bae06d19a15cce46eb4f3230a97f296) +--- + libfreerdp/cache/glyph.c | 15 +++++---------- + libfreerdp/core/orders.c | 4 ++-- + libfreerdp/core/update.c | 2 ++ + 3 files changed, 9 insertions(+), 12 deletions(-) + +--- a/libfreerdp/cache/glyph.c ++++ b/libfreerdp/cache/glyph.c +@@ -279,7 +279,7 @@ + if (y == -32768) + y = fast_glyph->bkTop; + +- if (fast_glyph->cbData > 1) ++ if (fast_glyph->cbData > 1 && NULL != fast_glyph->glyphData.aj) + { + /* got option font that needs to go into cache */ + glyph_data = &fast_glyph->glyphData; +@@ -290,7 +290,8 @@ + glyph->cx = glyph_data->cx; + glyph->cy = glyph_data->cy; + glyph->cb = glyph_data->cb; +- glyph->aj = glyph_data->aj; ++ glyph->aj = malloc(glyph_data->cb); ++ CopyMemory(glyph->aj, glyph_data->aj, glyph->cb); + Glyph_New(context, glyph); + + glyph_cache_put(cache->glyph, fast_glyph->cacheId, fast_glyph->data[0], glyph); +@@ -370,16 +371,14 @@ + + if (index > glyph_cache->glyphCache[id].number) + { +- fprintf(stderr, "invalid glyph cache index: %d in cache id: %d\n", index, id); ++ fprintf(stderr, "index %d out of range for cache id: %d\n", index, id); + return NULL; + } + + glyph = glyph_cache->glyphCache[id].entries[index]; + + if (glyph == NULL) +- { +- fprintf(stderr, "invalid glyph at cache index: %d in cache id: %d\n", index, id); +- } ++ fprintf(stderr, "no glyph found at cache index: %d in cache id: %d\n", index, id); + + return glyph; + } +@@ -420,9 +419,7 @@ + *size = (BYTE) glyph_cache->fragCache.entries[index].size; + + if (fragment == NULL) +- { + fprintf(stderr, "invalid glyph fragment at index:%d\n", index); +- } + + return fragment; + } +@@ -437,9 +434,7 @@ + glyph_cache->fragCache.entries[index].size = size; + + if (prevFragment != NULL) +- { + free(prevFragment); +- } + } + + void glyph_cache_register_callbacks(rdpUpdate* update) +--- a/libfreerdp/core/orders.c ++++ b/libfreerdp/core/orders.c +@@ -485,9 +485,7 @@ + Stream_Write_UINT8(s, byte); + } + else +- { + return FALSE; +- } + + return TRUE; + } +@@ -1670,6 +1668,8 @@ + if (Stream_GetRemainingLength(s) < glyph->cb) + return FALSE; + ++ if (glyph->aj) ++ free(glyph->aj); + glyph->aj = (BYTE*) malloc(glyph->cb); + Stream_Read(s, glyph->aj, glyph->cb); + } +--- a/libfreerdp/core/update.c ++++ b/libfreerdp/core/update.c +@@ -1596,6 +1596,8 @@ + + free(update->primary->polyline.points); + free(update->primary->polygon_sc.points); ++ if (NULL != update->primary->fast_glyph.glyphData.aj) ++ free(update->primary->fast_glyph.glyphData.aj); + free(update->primary); + + free(update->secondary); |