summaryrefslogtreecommitdiff
path: root/src/libicalvcal
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2021-09-09 13:52:11 +0200
committerAllen Winter <allen.winter@kdab.com>2021-09-19 09:15:44 -0400
commitae63f5c7fd18fa3b247c84c37c9644b683b68389 (patch)
treef289c05bfc3d5ff491bb8536aa0d738017ac9b13 /src/libicalvcal
parent15cf1ddf5331f828adc59ac74be83c7b119f5542 (diff)
downloadlibical-git-ae63f5c7fd18fa3b247c84c37c9644b683b68389.tar.gz
libicalvcal: Free memory allocated for parsing
Covers specially the error case, when in-the-middle of the parse could left some objects on the stack.
Diffstat (limited to 'src/libicalvcal')
-rw-r--r--src/libicalvcal/vcc.c9
-rw-r--r--src/libicalvcal/vcc.y9
2 files changed, 16 insertions, 2 deletions
diff --git a/src/libicalvcal/vcc.c b/src/libicalvcal/vcc.c
index 6fe0a55e..00eb97ff 100644
--- a/src/libicalvcal/vcc.c
+++ b/src/libicalvcal/vcc.c
@@ -987,6 +987,10 @@ void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
}
static void finiLex() {
+ VObject* vobj;
+ while(vobj = popVObject(), vobj) {
+ cleanVObject(vobj);
+ }
free(lexBuf.strs);
}
@@ -1298,9 +1302,12 @@ static VObject* Parse_MIMEHelper()
mime_lineNum = 1;
vObjList = 0;
curObj = 0;
+ curProp = 0;
- if (yyparse() != 0)
+ if (yyparse() != 0) {
+ finiLex();
return 0;
+ }
finiLex();
return vObjList;
diff --git a/src/libicalvcal/vcc.y b/src/libicalvcal/vcc.y
index 97c50ec7..030ca442 100644
--- a/src/libicalvcal/vcc.y
+++ b/src/libicalvcal/vcc.y
@@ -815,6 +815,10 @@ void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
}
static void finiLex() {
+ VObject* vobj;
+ while(vobj = popVObject(), vobj) {
+ cleanVObject(vobj);
+ }
free(lexBuf.strs);
}
@@ -1126,9 +1130,12 @@ static VObject* Parse_MIMEHelper()
mime_lineNum = 1;
vObjList = 0;
curObj = 0;
+ curProp = 0;
- if (yyparse() != 0)
+ if (yyparse() != 0) {
+ finiLex();
return 0;
+ }
finiLex();
return vObjList;