database: Add oid validation to database abstraction 40/145740/4
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Wed, 23 Aug 2017 10:32:38 +0000 (12:32 +0200)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Thu, 24 Aug 2017 11:52:04 +0000 (13:52 +0200)
Change-Id: I2657bdb8e2eddc7b5b4cd8d44b35a24f99fb8bd3
Signed-off-by: Paweł Szewczyk <p.szewczyk@samsung.com>
src/core/database.c
src/core/database.h
src/database/database_nop.c
src/database/ejdb.c
src/event_types/action_executed_event.c
src/event_types/decision_made_event.c
src/util/common.h
tests/unit/test_dbadapter.c

index d4e2acee5580450416f6cb26e75a63f8290d6f59..99b2398f77b9d86f46fa91c20ce2fdb771ca782f 100644 (file)
@@ -65,6 +65,14 @@ int database_get_by_oid(faultd_oid_t *oid, struct faultd_object *result)
        return database_adapter->get_by_oid(database_adapter, oid, result);
 }
 
+bool database_is_oid_valid(faultd_oid_t *oid)
+{
+       if (!database_adapter)
+               return false;
+
+       return database_adapter->is_oid_valid(oid);
+}
+
 const char *database_get_id_key(void)
 {
        if (!database_adapter)
index 2946c760126c9f0958357e1a3c8793200231c846..f204fe9c9723ebc9d9ec8a8701aaeff60e87b276 100644 (file)
@@ -38,6 +38,8 @@ struct faultd_database_adapter {
                                uint32_t *nr);
 
        int (*new_oid)(faultd_oid_t *oid);
+
+       bool (*is_oid_valid)(faultd_oid_t *oid);
 };
 
 #define to_database_adapter(MOD)                               \
@@ -48,6 +50,7 @@ int database_store(struct faultd_object *obj, faultd_oid_t *oid);
 int database_get_by_oid(faultd_oid_t *oid, struct faultd_object *result);
 int database_load(struct faultd_object *query, struct faultd_object *result, uint32_t *nr);
 int database_new_oid(faultd_oid_t *oid);
+bool database_is_oid_valid(faultd_oid_t *oid);
 const char *database_get_id_key(void);
 
 #endif /* _DATABASE_H_ */
index cf93612617087ab9e072fd363b710b8de0edb2bd..969b3530b288b1b176dc553fb3281db354769be8 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "database.h"
 
+#define NOP_DEFAULT_OID "NOP"
+
 struct nop_adapter {
        struct faultd_database_adapter database_adapter;
 };
@@ -60,10 +62,15 @@ static int nop_load(struct faultd_database_adapter *adapter,
 
 static int nop_new_oid(faultd_oid_t *oid)
 {
-       memset(oid, 0, sizeof(*oid));
+       strncpy(oid->nop, NOP_DEFAULT_OID, OID_NOP_SIZE);
        return 0;
 }
 
+static bool nop_is_oid_valid(faultd_oid_t *oid)
+{
+       return strncmp(oid->nop, NOP_DEFAULT_OID, OID_NOP_SIZE) == 0;
+}
+
 static struct nop_adapter nop_adapter = {
        .database_adapter = {
                .module = {
@@ -78,6 +85,7 @@ static struct nop_adapter nop_adapter = {
                .get_by_oid = nop_get_by_oid,
                .load = nop_load,
                .new_oid = nop_new_oid,
+               .is_oid_valid = nop_is_oid_valid,
        }
 };
 
index c93e56302c919ab8ef81cd3e86d55e4d12750eec..3b889e8c7a390ce2aa7f52182a33b9a04c9c1887 100644 (file)
@@ -379,6 +379,12 @@ static int ejdb_new_oid(faultd_oid_t *oid)
        return 0;
 }
 
+static bool ejdb_is_oid_valid(faultd_oid_t *oid)
+{
+       return oid->bson.ints[0] != 0 ||
+               oid->bson.ints[1] != 0 ||
+               oid->bson.ints[2] != 0;
+}
 
 static struct ejdb_adapter ejdb_adapter = {
        .database_adapter = {
@@ -394,6 +400,7 @@ static struct ejdb_adapter ejdb_adapter = {
                .get_by_oid = ejdb_get_by_oid,
                .load = ejdb_load,
                .new_oid = ejdb_new_oid,
+               .is_oid_valid = ejdb_is_oid_valid,
        }
 };
 
index 4af8362a877ea968e7a0a0f5349120a4f71d9f9d..96827a82e0229c58adcac7d1c8b583b7345e0a26 100644 (file)
@@ -21,6 +21,7 @@
 #include <malloc.h>
 
 #include "common.h"
+#include "database.h"
 #include "action_executed_event.h"
 
 static int allocate_ae_event(struct faultd_event_type *type,
@@ -106,6 +107,8 @@ static void ae_event_serialize(struct faultd_event *ev, struct faultd_object *ou
        struct action_executed_event *ae_ev =
                to_action_executed_event(ev);
 
+       assert(database_is_oid_valid(&ae_ev->reason->oid));
+
        faultd_event_serialize_internal(ev, out);
        faultd_object_append_oid(out, AE_EV_REASON, &ae_ev->reason->oid);
        faultd_object_append_string(out, AE_EV_ACTION, ae_ev->action);
index fafce4fe5eb8715e41db43fec68ed5a6e53972e5..fedc73619d0b7e2cd26a74d74561a99dea3037f5 100644 (file)
@@ -21,6 +21,7 @@
 #include <malloc.h>
 
 #include "common.h"
+#include "database.h"
 #include "decision_made_event.h"
 
 static int allocate_dm_event(struct faultd_event_type *type,
@@ -99,6 +100,8 @@ static void dm_event_serialize(struct faultd_event *ev, struct faultd_object *ou
        struct decision_made_event *dm_ev =
                to_decision_made_event(ev);
 
+       assert(database_is_oid_valid(&dm_ev->reason->oid));
+
        faultd_event_serialize_internal(ev, out);
        faultd_object_append_oid(out, DM_EV_REASON, &dm_ev->reason->oid);
        faultd_object_append_string(out, DM_EV_WHO, dm_ev->who_made);
index 31a09072053556b8e3b1906f0603b9acef1e7d60..16677880d128628370faeafb168decf60e6ad086 100644 (file)
@@ -74,8 +74,10 @@ enum faultd_type {
        TYPE_OBJECT,
 };
 
+#define OID_NOP_SIZE 4
 typedef union {
        bson_oid_t bson;
+       char nop[OID_NOP_SIZE];
        sd_id128_t uuid;
 } faultd_oid_t;
 
index 11f55ec769d3ce2c0bf5025cabde8bece7e44c87..f2f909f63f40255f27bdeaadf11f305a51fc47bd 100644 (file)
@@ -62,6 +62,11 @@ static int testdb_new_oid(faultd_oid_t *oid)
        return 0;
 }
 
+static bool testdb_is_oid_valid(faultd_oid_t *oid)
+{
+       return true;
+}
+
 static struct testdb_adapter testdb_adapter = {
        .database_adapter = {
                .module = {
@@ -76,6 +81,7 @@ static struct testdb_adapter testdb_adapter = {
                .get_by_oid = testdb_get_by_oid,
                .load = testdb_load,
                .new_oid = testdb_new_oid,
+               .is_oid_valid = testdb_is_oid_valid,
        }
 };