summaryrefslogtreecommitdiff
path: root/libxslt
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2023-02-26 16:53:35 +0100
committerNick Wellnhofer <wellnhofer@aevum.de>2023-02-26 16:55:37 +0100
commit2925103a1612c6225d867d298769bb9ec5c1cb46 (patch)
tree2d670e1f5e20bac3c8fd4c552fd69b1b6cb19412 /libxslt
parent3e151b2350f2d20649c092bf9d1baf191e03a379 (diff)
downloadlibxslt-2925103a1612c6225d867d298769bb9ec5c1cb46.tar.gz
malloc-fail: Fix null deref after xsltLocalVariablePush
Found with libFuzzer, see #84.
Diffstat (limited to 'libxslt')
-rw-r--r--libxslt/transform.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/libxslt/transform.c b/libxslt/transform.c
index f565e85d..27806785 100644
--- a/libxslt/transform.c
+++ b/libxslt/transform.c
@@ -2229,26 +2229,18 @@ xsltLocalVariablePush(xsltTransformContextPtr ctxt,
xsltStackElemPtr variable,
int level)
{
- if (ctxt->varsMax == 0) {
- ctxt->varsMax = 10;
- ctxt->varsTab =
- (xsltStackElemPtr *) xmlMalloc(ctxt->varsMax *
- sizeof(ctxt->varsTab[0]));
- if (ctxt->varsTab == NULL) {
- xmlGenericError(xmlGenericErrorContext, "malloc failed !\n");
- return (-1);
- }
- }
if (ctxt->varsNr >= ctxt->varsMax) {
- ctxt->varsMax *= 2;
- ctxt->varsTab =
- (xsltStackElemPtr *) xmlRealloc(ctxt->varsTab,
- ctxt->varsMax *
- sizeof(ctxt->varsTab[0]));
- if (ctxt->varsTab == NULL) {
+ xsltStackElemPtr *tmp;
+ int newMax = ctxt->varsMax == 0 ? 10 : 2 * ctxt->varsMax;
+
+ tmp = (xsltStackElemPtr *) xmlRealloc(ctxt->varsTab,
+ newMax * sizeof(*tmp));
+ if (tmp == NULL) {
xmlGenericError(xmlGenericErrorContext, "realloc failed !\n");
return (-1);
}
+ ctxt->varsTab = tmp;
+ ctxt->varsMax = newMax;
}
ctxt->varsTab[ctxt->varsNr++] = variable;
ctxt->vars = variable;