summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsu_v <suv-sf@users.sourceforge.net>2012-09-23 17:26:54 +0000
committer~suv <suv-sf@users.sourceforge.net>2012-09-23 17:26:54 +0000
commita5df19880fa6819861053ba8e351af9e8df4b796 (patch)
tree4141d7d7a6fa61e98c7ce535c6590cbac9fd7478 /src
parentmerge from trunk (r11698) (diff)
downloadinkscape-a5df19880fa6819861053ba8e351af9e8df4b796.tar.gz
inkscape-a5df19880fa6819861053ba8e351af9e8df4b796.zip
Fix pointer issue in EMF code
(bzr r11668.1.11)
Diffstat (limited to 'src')
-rw-r--r--src/extension/internal/emf-inout.cpp36
1 files changed, 27 insertions, 9 deletions
diff --git a/src/extension/internal/emf-inout.cpp b/src/extension/internal/emf-inout.cpp
index 4b2767313..9fef38333 100644
--- a/src/extension/internal/emf-inout.cpp
+++ b/src/extension/internal/emf-inout.cpp
@@ -363,7 +363,7 @@ typedef struct {
typedef struct emf_device_context {
struct SPStyle style;
- class SPTextStyle tstyle;
+ char *font_name;
bool stroke_set;
int stroke_mode; // enumeration from drawmode, not used if fill_set is not True
int stroke_idx; // used with DRAW_PATTERN and DRAW_IMAGE to return the appropriate fill
@@ -390,6 +390,7 @@ typedef struct emf_device_context {
#define EMF_MAX_DC 128
+
typedef struct emf_callback_data {
Glib::ustring *outsvg;
Glib::ustring *path;
@@ -1320,8 +1321,8 @@ select_font(PEMF_CALLBACK_DATA d, int index)
d->dc[d->level].style.font_style.value = (pEmr->elfw.elfLogFont.lfItalic ? SP_CSS_FONT_STYLE_ITALIC : SP_CSS_FONT_STYLE_NORMAL);
d->dc[d->level].style.text_decoration.underline = pEmr->elfw.elfLogFont.lfUnderline;
d->dc[d->level].style.text_decoration.line_through = pEmr->elfw.elfLogFont.lfStrikeOut;
- if (d->dc[d->level].tstyle.font_family.value){ free(d->dc[d->level].tstyle.font_family.value); }
- d->dc[d->level].tstyle.font_family.value =
+ if (d->dc[d->level].font_name){ free(d->dc[d->level].font_name); }
+ d->dc[d->level].font_name =
U_Utf16leToUtf8((uint16_t *) (pEmr->elfw.elfLogFont.lfFaceName), U_LF_FACESIZE, NULL);
d->dc[d->level].style.baseline_shift.value = ((pEmr->elfw.elfLogFont.lfEscapement + 3600) % 3600) / 10; // use baseline_shift instead of text_transform to avoid overflow
}
@@ -1384,7 +1385,8 @@ int myEnhMetaFileProc(char *contents, unsigned int length, PEMF_CALLBACK_DATA d)
if(off>=length)return(0); //normally should exit from while after EMREOF sets OK to false.
lpEMFR = (PU_ENHMETARECORD)(contents + off);
-// std::cout << "record type: " << lpEMFR->iType << " length: " << lpEMFR->nSize << "offset: " << off <<std::endl;
+// Uncomment the following to track down toxic records
+//std::cout << "record type: " << lpEMFR->iType << " length: " << lpEMFR->nSize << " offset: " << off <<std::endl;
off += lpEMFR->nSize;
SVGOStringStream tmp_outsvg;
@@ -1888,6 +1890,9 @@ std::cout << "BEFORE DRAW"
if (d->level < EMF_MAX_DC) {
d->dc[d->level + 1] = d->dc[d->level];
+ if(d->dc[d->level].font_name){
+ d->dc[d->level + 1].font_name = strdup(d->dc[d->level].font_name); // or memory access problems because font name pointer duplicated
+ }
d->level = d->level + 1;
}
break;
@@ -1906,8 +1911,13 @@ std::cout << "BEFORE DRAW"
d->level = d->level + pEmr->iRelative;
}
while (old_level > d->level) {
- if (d->dc[old_level].style.stroke_dash.dash && (old_level==0 || (old_level>0 && d->dc[old_level].style.stroke_dash.dash!=d->dc[old_level-1].style.stroke_dash.dash)))
+ if (d->dc[old_level].style.stroke_dash.dash && (old_level==0 || (old_level>0 && d->dc[old_level].style.stroke_dash.dash!=d->dc[old_level-1].style.stroke_dash.dash))){
delete[] d->dc[old_level].style.stroke_dash.dash;
+ }
+ if(d->dc[old_level].font_name){
+ free(d->dc[old_level].font_name); // else memory leak
+ d->dc[old_level].font_name = NULL;
+ }
old_level--;
}
break;
@@ -2653,9 +2663,9 @@ std::cout << "BEFORE DRAW"
msdepua(dup_wt); //convert everything in Microsoft's private use area. For Symbol, Wingdings, Dingbats
- if(NonToUnicode(dup_wt, d->dc[d->level].tstyle.font_family.value)){
- g_free(d->dc[d->level].tstyle.font_family.value);
- d->dc[d->level].tstyle.font_family.value = g_strdup("Times New Roman");
+ if(NonToUnicode(dup_wt, d->dc[d->level].font_name)){
+ g_free(d->dc[d->level].font_name);
+ d->dc[d->level].font_name = g_strdup("Times New Roman");
}
char *ansi_text;
@@ -2718,7 +2728,7 @@ std::cout << "BEFORE DRAW"
<< "font-weight:" << (b ? "bold" : "normal") << ";"
<< "text-align:" << (lcr==2 ? "center" : lcr==1 ? "end" : "start") << ";"
<< "text-anchor:" << (lcr==2 ? "middle" : lcr==1 ? "end" : "start") << ";"
- << "font-family:" << d->dc[d->level].tstyle.font_family.value << ";"
+ << "font-family:" << d->dc[d->level].font_name << ";"
<< "\"\n";
ts << " >";
ts << escaped_text;
@@ -3017,6 +3027,10 @@ Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
memset(&d, 0, sizeof(d));
+ for(int i = 0; i < EMF_MAX_DC+1; i++){ // be sure all values and pointers are empty to start with
+ memset(&(d.dc[i]),0,sizeof(EMF_DEVICE_CONTEXT));
+ }
+
d.dc[0].worldTransform.eM11 = 1.0;
d.dc[0].worldTransform.eM12 = 0.0;
d.dc[0].worldTransform.eM21 = 0.0;
@@ -3078,6 +3092,10 @@ Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
if (d.dc[0].style.stroke_dash.dash)
delete[] d.dc[0].style.stroke_dash.dash;
+
+ for(int i=0; i<=d.level;i++){
+ if(d.dc[i].font_name)free(d.dc[i].font_name);
+ }
return doc;
}