summaryrefslogtreecommitdiff
path: root/navit/command.c
diff options
context:
space:
mode:
authormdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2012-12-04 20:15:23 +0000
committermdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2012-12-04 20:15:23 +0000
commitd6969a8984704268e41a14afda312bc483ff4b1b (patch)
treef81203e5473aabf6c08e1ee9d665b82475296718 /navit/command.c
parenta4e0e70d5c0192c94f4dcbf8b8ae9fc8467e2a5c (diff)
downloadnavit-svn-d6969a8984704268e41a14afda312bc483ff4b1b.tar.gz
Fix:core:Don't crash when command system references a nonexistent object. Silently ignore such references.
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5282 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/command.c')
-rw-r--r--navit/command.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/navit/command.c b/navit/command.c
index 8865ed99..934422da 100644
--- a/navit/command.c
+++ b/navit/command.c
@@ -157,7 +157,7 @@ command_object_get_attr(struct context *ctx, struct attr *object, enum attr_type
int r;
struct attr dup;
struct object_func *func=object_func_lookup(object->type);
- if (!func || !func->get_attr)
+ if (!object->u.data || !func || !func->get_attr)
return 0;
r=func->get_attr(object->u.data, attr_type, &dup, NULL);
if(r)
@@ -169,7 +169,7 @@ static int
command_object_add_attr(struct context *ctx, struct attr *object, struct attr *attr)
{
struct object_func *func=object_func_lookup(object->type);
- if (!func || !func->add_attr)
+ if (!object->u.data || !func || !func->add_attr)
return 0;
return func->add_attr(object->u.data, attr);
}
@@ -178,7 +178,7 @@ static int
command_object_remove_attr(struct context *ctx, struct attr *object, struct attr *attr)
{
struct object_func *func=object_func_lookup(object->type);
- if (!func || !func->remove_attr)
+ if (!object->u.data || !func || !func->remove_attr)
return 0;
return func->remove_attr(object->u.data, attr);
}
@@ -213,7 +213,7 @@ command_set_attr(struct context *ctx, struct result *res, struct result *newres)
{
enum attr_type attr_type=command_attr_type(res);
struct object_func *func=object_func_lookup(res->attr.type);
- if (!func || !func->set_attr)
+ if (!res->attr.u.data || !func || !func->set_attr)
return;
if (attr_type == attr_attr_types) {
char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1));
@@ -518,6 +518,10 @@ eval_postfix(struct context *ctx, struct result *res)
struct attr attr;
enum attr_type attr_type=command_attr_type(res);
void *obj=res->attr.u.data;
+ if (!obj) {
+ dbg(0,"no object\n");
+ return;
+ }
if (!obj_func) {
dbg(0,"no object func\n");
return;