xkbcomp: Don't leak atom text and string exprs
authorDaniel Stone <daniel@fooishbar.org>
Tue, 15 Jun 2010 14:20:32 +0000 (15:20 +0100)
committerDaniel Stone <daniel@fooishbar.org>
Tue, 22 Jun 2010 14:56:55 +0000 (15:56 +0100)
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
src/xkbcomp/action.c
src/xkbcomp/compat.c

index 6d55d68..3f0953d 100644 (file)
@@ -373,7 +373,7 @@ CheckModifierField(XkbcDescPtr xkb,
     if (value->op == ExprIdent)
     {
         register char *valStr;
-        valStr = XkbcAtomGetString(value->value.str);
+        valStr = XkbcAtomText(value->value.str);
         if (valStr && ((uStrCaseCmp(valStr, "usemodmapmods") == 0) ||
                        (uStrCaseCmp(valStr, "modmapmods") == 0)))
         {
@@ -1202,6 +1202,7 @@ HandlePrivate(XkbcDescPtr xkb,
                 }
                 strncpy((char *) action->data, rtrn.str, 7);
             }
+            free(rtrn.str);
             return True;
         }
         else
@@ -1368,13 +1369,19 @@ HandleActionDef(ExprDef * def,
             ERROR("Cannot change defaults in an action definition\n");
             ACTION("Ignoring attempt to change %s.%s\n", elemRtrn.str,
                     fieldRtrn.str);
+            free(elemRtrn.str);
+            free(fieldRtrn.str);
             return False;
         }
         if (!stringToField(fieldRtrn.str, &fieldNdx))
         {
             ERROR("Unknown field name %s\n", uStringText(fieldRtrn.str));
+            free(elemRtrn.str);
+            free(fieldRtrn.str);
             return False;
         }
+        free(elemRtrn.str);
+        free(fieldRtrn.str);
         if (!(*handleAction[hndlrType])
             (xkb, action, fieldNdx, arrayRtrn, value))
         {
@@ -1408,17 +1415,22 @@ SetActionField(XkbcDescPtr xkb,
     else
     {
         if (!stringToAction(elem, &new->action))
+        {
+            free(new);
             return False;
+        }
         if (new->action == XkbSA_NoAction)
         {
             ERROR("\"%s\" is not a valid field in a NoAction action\n",
                    field);
+            free(new);
             return False;
         }
     }
     if (!stringToField(field, &new->field))
     {
         ERROR("\"%s\" is not a legal field name\n", field);
+        free(new);
         return False;
     }
     new->array_ndx = array_ndx;
index 1e518cf..461c759 100644 (file)
@@ -608,19 +608,22 @@ HandleInterpVar(VarDef * stmt, XkbcDescPtr xkb, CompatInfo * info)
 {
     ExprResult elem, field;
     ExprDef *ndx;
+    int ret;
 
     if (ExprResolveLhs(stmt->name, &elem, &field, &ndx) == 0)
-        return 0;               /* internal error, already reported */
-    if (elem.str && (uStrCaseCmp(elem.str, "interpret") == 0))
-        return SetInterpField(&info->dflt, xkb, field.str, ndx, stmt->value,
+        ret = 0;               /* internal error, already reported */
+    else if (elem.str && (uStrCaseCmp(elem.str, "interpret") == 0))
+        ret = SetInterpField(&info->dflt, xkb, field.str, ndx, stmt->value,
                               info);
-    if (elem.str && (uStrCaseCmp(elem.str, "indicator") == 0))
-    {
-        return SetIndicatorMapField(&info->ledDflt, xkb, field.str, ndx,
-                                    stmt->value);
-    }
-    return SetActionField(xkb, elem.str, field.str, ndx, stmt->value,
-                          &info->act);
+    else if (elem.str && (uStrCaseCmp(elem.str, "indicator") == 0))
+        ret = SetIndicatorMapField(&info->ledDflt, xkb, field.str, ndx,
+                                  stmt->value);
+    else
+        ret = SetActionField(xkb, elem.str, field.str, ndx, stmt->value,
+                            &info->act);
+    free(elem.str);
+    free(field.str);
+    return ret;
 }
 
 static int