aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2009-01-28 22:38:57 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2009-01-28 22:38:57 +0100
commit714f44f6412ecf4cfd62abd9133210f0bf937e75 (patch)
tree0ff4a9d34c730a326ab9a473afe0f91c67c08193
parent8ec2a45a3c8baf45fa75857d3587b21bcf5de78f (diff)
make sure strings from CSS parser are freed
-rw-r--r--src/css.cc17
-rw-r--r--src/css.hh13
-rw-r--r--src/cssparser.cc4
3 files changed, 28 insertions, 6 deletions
diff --git a/src/css.cc b/src/css.cc
index a71f1ce5..30c5bc55 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -24,6 +24,23 @@ void CssProperty::print () {
fprintf (stderr, "%s - %d\n", Css_property_info[name].symbol, value.intVal);
}
+CssPropertyList::~CssPropertyList () {
+ if (ownerOfStrings) {
+ for (int i = 0; i < size (); i++) {
+ CssProperty *p = getRef (i);
+
+ switch (p->name) {
+ case CssProperty::CSS_PROPERTY_CONTENT:
+ case CssProperty::CSS_PROPERTY_FONT_FAMILY:
+ dFree (p->value.strVal);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
void CssPropertyList::set (CssProperty::Name name, CssProperty::Value value) {
for (int i = 0; i < size (); i++)
if (getRef (i)->name == name) {
diff --git a/src/css.hh b/src/css.hh
index 086e318a..0151b7f7 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -52,7 +52,7 @@ class CssProperty {
public:
typedef union {
int intVal;
- const char *strVal;
+ char *strVal;
} Value;
typedef enum {
@@ -167,19 +167,24 @@ class CssProperty {
* \brief A list of CssProperty objects.
*/
class CssPropertyList : public lout::misc::SimpleVector <CssProperty> {
- int refCount;
+ int refCount;
+ bool ownerOfStrings;
public:
- CssPropertyList() : lout::misc::SimpleVector <CssProperty> (1) {
+ CssPropertyList(bool ownerOfStrings = false) :
+ lout::misc::SimpleVector <CssProperty> (1) {
refCount = 0;
+ this->ownerOfStrings = ownerOfStrings;
};
CssPropertyList(const CssPropertyList &p) :
lout::misc::SimpleVector <CssProperty> (p) {
refCount = 0;
+ ownerOfStrings = false;
};
+ ~CssPropertyList ();
void set (CssProperty::Name name, CssProperty::Value value);
- void set (CssProperty::Name name, const char *value) {
+ void set (CssProperty::Name name, char *value) {
CssProperty::Value v;
v.strVal = value;
set (name, v);
diff --git a/src/cssparser.cc b/src/cssparser.cc
index d000c45f..03fc102c 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -1110,9 +1110,9 @@ static void Css_parse_ruleset(CssParser * parser)
DEBUG_MSG(DEBUG_PARSE_LEVEL, "end of %s\n", "selectors");
- props = new CssPropertyList();
+ props = new CssPropertyList(true);
props->ref();
- importantProps = new CssPropertyList();
+ importantProps = new CssPropertyList(true);
importantProps->ref();
/* Read block. ('{' has already been read.) */