Plug leaks in geometry parsing When parsing a geometry file, don't leak the elements we've created. Signed-off-by: Daniel Stone <daniel@fooishbar.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
diff --git a/src/xkbcomp/parseutils.c b/src/xkbcomp/parseutils.c
index a36d015..107be23 100644
--- a/src/xkbcomp/parseutils.c
+++ b/src/xkbcomp/parseutils.c
@@ -614,9 +614,6 @@ StmtSetMerge(ParseCommon * stmt, unsigned merge)
}
static void
-FreeStmt(ParseCommon *stmt);
-
-static void
FreeExpr(ExprDef *expr)
{
int i;
@@ -677,7 +674,7 @@ FreeInclude(IncludeStmt *incl)
}
}
-static void
+void
FreeStmt(ParseCommon *stmt)
{
ParseCommon *next;
diff --git a/src/xkbcomp/parseutils.h b/src/xkbcomp/parseutils.h
index 18c2c6c..89458df 100644
--- a/src/xkbcomp/parseutils.h
+++ b/src/xkbcomp/parseutils.h
@@ -154,4 +154,7 @@ extern void setScanState(const char * /* file */ ,
int /* line */
);
+extern void FreeStmt(ParseCommon * /* stmt */
+ );
+
#endif /* XKBPARSE_H */
diff --git a/src/xkbcomp/xkbparse.y b/src/xkbcomp/xkbparse.y
index 7c18e32..13e5628 100644
--- a/src/xkbcomp/xkbparse.y
+++ b/src/xkbcomp/xkbparse.y
@@ -194,18 +194,30 @@ XkbMapConfig : OptFlags FileType OptMapName OBRACE
CBRACE SEMI
{
if ($2 == XkmGeometryIndex)
+ {
+ free($3);
+ FreeStmt($5);
$$= NULL;
+ }
else
+ {
$$= CreateXKBFile($2,$3,$5,$1);
+ }
}
;
XkbConfig : OptFlags FileType OptMapName DeclList
{
if ($2 == XkmGeometryIndex)
+ {
+ free($3);
+ FreeStmt($4);
$$= NULL;
+ }
else
+ {
$$= CreateXKBFile($2,$3,$4,$1);
+ }
}
;
@@ -455,11 +467,11 @@ SectionBody : SectionBody SectionBodyItem
SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI
{ $$= NULL; }
| VarDecl
- { $$= NULL; }
+ { FreeStmt(&$1->common); $$= NULL; }
| DoodadDecl
{ $$= NULL; }
| IndicatorMapDecl
- { $$= NULL; }
+ { FreeStmt(&$1->common); $$= NULL; }
| OverlayDecl
{ $$= NULL; }
;
@@ -473,7 +485,7 @@ RowBody : RowBody RowBodyItem
RowBodyItem : KEYS OBRACE Keys CBRACE SEMI
{ $$= NULL; }
| VarDecl
- { $$= NULL; }
+ { FreeStmt(&$1->common); $$= NULL; }
;
Keys : Keys COMMA Key
@@ -483,9 +495,9 @@ Keys : Keys COMMA Key
;
Key : KeyName
- { $$= NULL; }
+ { free($1); $$= NULL; }
| OBRACE ExprList CBRACE
- { $$= NULL; }
+ { FreeStmt(&$2->common); $$= NULL; }
;
OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
@@ -493,15 +505,13 @@ OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
;
OverlayKeyList : OverlayKeyList COMMA OverlayKey
- {
- $$= NULL;
- }
+ { $$= NULL; }
| OverlayKey
{ $$= NULL; }
;
OverlayKey : KeyName EQUALS KeyName
- { $$= NULL; }
+ { free($1); free($3); $$= NULL; }
;
OutlineList : OutlineList COMMA OutlineInList
@@ -515,7 +525,7 @@ OutlineInList : OBRACE CoordList CBRACE
| Ident EQUALS OBRACE CoordList CBRACE
{ $$= NULL; }
| Ident EQUALS Expr
- { $$= NULL; }
+ { FreeStmt(&$3->common); $$= NULL; }
;
CoordList : CoordList COMMA Coord
@@ -529,7 +539,7 @@ Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET
;
DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI
- { $$= NULL; }
+ { FreeStmt(&$4->common); $$= NULL; }
;
DoodadType : TEXT { $$= 0; }