From: Paweł Szewczyk Date: Wed, 23 Aug 2017 10:32:38 +0000 (+0200) Subject: database: Add oid validation to database abstraction X-Git-Tag: submit/tizen/20170919.135738~22 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=01e04fc1b2fea007a1f0fa962bc92e465779511d;p=platform%2Fcore%2Fsystem%2Ffaultd.git database: Add oid validation to database abstraction Change-Id: I2657bdb8e2eddc7b5b4cd8d44b35a24f99fb8bd3 Signed-off-by: Paweł Szewczyk --- diff --git a/src/core/database.c b/src/core/database.c index d4e2ace..99b2398 100644 --- a/src/core/database.c +++ b/src/core/database.c @@ -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) diff --git a/src/core/database.h b/src/core/database.h index 2946c76..f204fe9 100644 --- a/src/core/database.h +++ b/src/core/database.h @@ -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_ */ diff --git a/src/database/database_nop.c b/src/database/database_nop.c index cf93612..969b353 100644 --- a/src/database/database_nop.c +++ b/src/database/database_nop.c @@ -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, } }; diff --git a/src/database/ejdb.c b/src/database/ejdb.c index c93e563..3b889e8 100644 --- a/src/database/ejdb.c +++ b/src/database/ejdb.c @@ -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, } }; diff --git a/src/event_types/action_executed_event.c b/src/event_types/action_executed_event.c index 4af8362..96827a8 100644 --- a/src/event_types/action_executed_event.c +++ b/src/event_types/action_executed_event.c @@ -21,6 +21,7 @@ #include #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); diff --git a/src/event_types/decision_made_event.c b/src/event_types/decision_made_event.c index fafce4f..fedc736 100644 --- a/src/event_types/decision_made_event.c +++ b/src/event_types/decision_made_event.c @@ -21,6 +21,7 @@ #include #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); diff --git a/src/util/common.h b/src/util/common.h index 31a0907..1667788 100644 --- a/src/util/common.h +++ b/src/util/common.h @@ -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; diff --git a/tests/unit/test_dbadapter.c b/tests/unit/test_dbadapter.c index 11f55ec..f2f909f 100644 --- a/tests/unit/test_dbadapter.c +++ b/tests/unit/test_dbadapter.c @@ -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, } };