From c45cdb0c677b88c268615db171030a2500bff3dc Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Thu, 16 Feb 2012 00:22:11 +0000 Subject: [PATCH] Still more memory leak fixes Signed-off-by: Daniel Stone --- src/alloc.c | 1 + src/xkbcomp/compat.c | 4 +++- src/xkbcomp/expr.c | 9 +++++---- src/xkbcomp/geometry.c | 15 +++++++++++++++ src/xkbcomp/keycodes.c | 1 + src/xkbcomp/keytypes.c | 14 ++++++++++++-- src/xkbcomp/parseutils.c | 2 +- src/xkbcomp/symbols.c | 6 ++++-- src/xkbcomp/xkbparse.y | 2 +- 9 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 3d1c7b2..0966fc5 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -279,6 +279,7 @@ static void XkbcFreeControls(struct xkb_desc * xkb, unsigned which, Bool freeMap) { if (freeMap && xkb && xkb->ctrls) { + free(xkb->ctrls->per_key_repeat); free(xkb->ctrls); xkb->ctrls = NULL; } diff --git a/src/xkbcomp/compat.c b/src/xkbcomp/compat.c index bad5cc2..bae43c4 100644 --- a/src/xkbcomp/compat.c +++ b/src/xkbcomp/compat.c @@ -643,9 +643,11 @@ HandleInterpBody(VarDef * def, struct xkb_desc * xkb, SymInterpInfo * si, continue; } ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx); - if (ok) + if (ok) { ok = SetInterpField(si, xkb, field.str, arrayNdx, def->value, info); + free(field.str); + } } return ok; } diff --git a/src/xkbcomp/expr.c b/src/xkbcomp/expr.c index 1d14341..f49d1d7 100644 --- a/src/xkbcomp/expr.c +++ b/src/xkbcomp/expr.c @@ -691,10 +691,7 @@ ExprResolveString(ExprDef * expr, } val_rtrn->str = XkbcAtomGetString(expr->value.str); if (val_rtrn->str == NULL) - { - static char *empty = ""; - val_rtrn->str = empty; - } + val_rtrn->str = strdup(""); return True; case ExprIdent: if (lookup) @@ -731,9 +728,13 @@ ExprResolveString(ExprDef * expr, if (new) { sprintf(new, "%s%s", leftRtrn.str, rightRtrn.str); + free(leftRtrn.str); + free(rightRtrn.str); val_rtrn->str = new; return True; } + free(leftRtrn.str); + free(rightRtrn.str); } return False; case OpSubtract: diff --git a/src/xkbcomp/geometry.c b/src/xkbcomp/geometry.c index 7dde6f8..9114913 100644 --- a/src/xkbcomp/geometry.c +++ b/src/xkbcomp/geometry.c @@ -1489,6 +1489,7 @@ SetShapeDoodadField(DoodadInfo * di, } di->shape = xkb_intern_atom(tmp.str); di->defs.defined |= _GD_Shape; + free(tmp.str); return True; } return ReportBadField(typeName, field, ddText(di)); @@ -1621,6 +1622,7 @@ SetTextDoodadField(DoodadInfo * di, } di->defs.defined |= def; *pField.str = xkb_intern_atom(tmp.str); + free(tmp.str); } else { @@ -1683,6 +1685,7 @@ SetIndicatorDoodadField(DoodadInfo * di, di->defs.defined |= _GD_Shape; di->shape = xkb_intern_atom(tmp.str); } + free(tmp.str); return True; } return ReportBadField("indicator doodad", field, ddText(di)); @@ -1743,6 +1746,7 @@ SetLogoDoodadField(DoodadInfo * di, return ReportBadType(typeName, field, ddText(di), "string"); } di->shape = xkb_intern_atom(tmp.str); + free(tmp.str); di->defs.defined |= _GD_Shape; return True; } @@ -1761,6 +1765,7 @@ SetLogoDoodadField(DoodadInfo * di, "string"); } di->logoName = _XkbDupString(tmp.str); + free(tmp.str); return True; } return ReportBadField(typeName, field, ddText(di)); @@ -2613,12 +2618,20 @@ HandleComplexKey(KeyDef * def, KeyInfo * key, GeometryInfo * info) { if (!SetKeyField (key, f.str, ndx, expr->value.binary.right, info)) + { + free(elem.str); + free(f.str); return False; + } + free(elem.str); + free(f.str); } else { ERROR("Illegal element used in a key definition\n"); ACTION("Assignment to %s.%s ignored\n", elem.str, f.str); + free(elem.str); + free(f.str); return False; } } @@ -2689,6 +2702,8 @@ HandleRowBody(RowDef * def, RowInfo * row, unsigned merge, WARN("Assignment to field of unknown element in row\n"); ACTION("No value assigned to %s.%s\n", elem.str, field.str); } + free(elem.str); + free(field.str); } else if (keyDef->common.stmtType == StmtKeyDef) { diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index c8bbadc..40fe60a 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -615,6 +615,7 @@ HandleIncludeKeycodes(IncludeStmt * stmt, struct xkb_desc * xkb, KeyNamesInfo * else { info->errorCount += 10; /* XXX: Why 10?? */ + ClearKeyNamesInfo(&included); return False; } } diff --git a/src/xkbcomp/keytypes.c b/src/xkbcomp/keytypes.c index b19d7bd..aa18be7 100644 --- a/src/xkbcomp/keytypes.c +++ b/src/xkbcomp/keytypes.c @@ -435,6 +435,7 @@ HandleIncludeKeyTypes(IncludeStmt * stmt, else { info->errorCount += 10; + FreeKeyTypesInfo(&included); return False; } } @@ -951,9 +952,11 @@ HandleKeyTypeBody(VarDef * def, continue; } ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx); - if (ok) + if (ok) { ok = SetKeyTypeField(type, xkb, field.str, arrayNdx, def->value, info); + free(field.str); + } } return ok; } @@ -1214,6 +1217,7 @@ CompileKeyTypes(XkbFile *file, struct xkb_desc * xkb, unsigned merge) i++; if (XkbcAllocClientMap(xkb, XkbKeyTypesMask, i) != Success) { + FreeKeyTypesInfo(&info); WSGO("Couldn't allocate client map\n"); return False; } @@ -1226,6 +1230,7 @@ CompileKeyTypes(XkbFile *file, struct xkb_desc * xkb, unsigned merge) keypadVMod = FindKeypadVMod(xkb); if (XkbcInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success) { + FreeKeyTypesInfo(&info); WSGO("Couldn't initialize canonical key types\n"); return False; } @@ -1252,11 +1257,16 @@ CompileKeyTypes(XkbFile *file, struct xkb_desc * xkb, unsigned merge) else type = next++; DeleteLevel1MapEntries(def); - if (!CopyDefToKeyType(xkb, type, def)) + if (!CopyDefToKeyType(xkb, type, def)) { + FreeKeyTypesInfo(&info); return False; + } def = (KeyTypeInfo *) def->defs.next; } + FreeKeyTypesInfo(&info); return True; } + + FreeKeyTypesInfo(&info); return False; } diff --git a/src/xkbcomp/parseutils.c b/src/xkbcomp/parseutils.c index 69b8a5c..65de324 100644 --- a/src/xkbcomp/parseutils.c +++ b/src/xkbcomp/parseutils.c @@ -226,7 +226,7 @@ InterpCreate(char *sym, ExprDef * match) { def->common.stmtType = StmtInterpDef; def->common.next = NULL; - def->sym = strdup(sym); + def->sym = sym; def->match = match; } else diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c index cbf3bd6..49cef4b 100644 --- a/src/xkbcomp/symbols.c +++ b/src/xkbcomp/symbols.c @@ -1405,6 +1405,7 @@ SetGroupName(SymbolsInfo * info, ExprDef * arrayNdx, ExprDef * value) } info->groupNames[tmp.uval - 1 + info->explicit_group] = xkb_intern_atom(name.str); + free(name.str); return True; } @@ -1527,9 +1528,9 @@ HandleSymbolsBody(VarDef * def, { if ((def->value == NULL) || (def->value->op == ExprKeysymList)) - field.str = "symbols"; + field.str = strdup("symbols"); else - field.str = "actions"; + field.str = strdup("actions"); arrayNdx = NULL; } else @@ -1539,6 +1540,7 @@ HandleSymbolsBody(VarDef * def, if (ok) ok = SetSymbolsField(key, xkb, field.str, arrayNdx, def->value, info); + free(field.str); } } return ok; diff --git a/src/xkbcomp/xkbparse.y b/src/xkbcomp/xkbparse.y index 5634fb7..60c445b 100644 --- a/src/xkbcomp/xkbparse.y +++ b/src/xkbcomp/xkbparse.y @@ -392,7 +392,7 @@ KeyTypeDecl : TYPE String OBRACE SymbolsDecl : KEY KeyName OBRACE SymbolsBody CBRACE SEMI - { $$= SymbolsCreate($2,(ExprDef *)$4); } + { $$= SymbolsCreate($2,(ExprDef *)$4); free($2); } ; SymbolsBody : SymbolsBody COMMA SymbolsVarDecl -- 2.7.4