]> git.draconx.ca Git - upkg.git/commitdiff
uobject: Improve error handling in property decoding.
authorNick Bowler <nbowler@draconx.ca>
Sat, 19 May 2012 20:14:53 +0000 (16:14 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sat, 19 May 2012 20:14:53 +0000 (16:14 -0400)
Verify that the encoded size is actually correct, and use the proper
logging method to report errors.

src/uobject/uobject.c

index 74734dd1bfd0c73758fe73698c66b66aca0ff292..a0826902d5a029998b807da9486a2ef112b02538 100644 (file)
@@ -314,20 +314,22 @@ static unsigned long deserialize_property(UObject *uo, struct prop_head *head)
        case PROPERTY_END:
                break;
        case PROPERTY_BYTE:
-               if (priv->nbuf-len < 1)
+               if (head->size != 1 || priv->nbuf-len < head->size)
                        return 0;
                g_value_init(&val, G_TYPE_UCHAR);
                g_value_set_uchar(&val, priv->buf[len]);
                g_object_set_property(G_OBJECT(uo), head->prop_name, &val);
                break;
        case PROPERTY_INTEGER:
-               if (priv->nbuf-len < 4)
+               if (head->size != 4 || priv->nbuf-len < head->size)
                        return 0;
                g_value_init(&val, G_TYPE_ULONG);
                g_value_set_ulong(&val, unpack_32_le(priv->buf+len));
                g_object_set_property(G_OBJECT(uo), head->prop_name, &val);
                break;
        case PROPERTY_BOOLEAN:
+               if (head->size != 0)
+                       return 0;
                g_value_init(&val, G_TYPE_BOOLEAN);
                g_value_set_boolean(&val, head->tag_msb);
                g_object_set_property(G_OBJECT(uo), head->prop_name, &val);
@@ -339,8 +341,8 @@ static unsigned long deserialize_property(UObject *uo, struct prop_head *head)
                g_object_set_property(G_OBJECT(uo), head->prop_name, &val);
                break;
        default:
-               fprintf(stderr, "Unhandled property type %x\n",
-                               (unsigned)head->type);
+               u_warn(uo, "%s: unsupported property type %u",
+                          head->prop_name, (unsigned)head->type);
        }
        len += head->size;