From cfae93c9d029930ed96e3d0c412527c8d1affc8b Mon Sep 17 00:00:00 2001 From: hyunuktak Date: Fri, 13 Jul 2018 15:46:36 +0900 Subject: [PATCH] Modified to update firewall rule Change-Id: I0a452c3e7eea1a33f93f7a39df182d9e77c01ced Signed-off-by: hyunuktak --- src/database/include/table-firewall.h | 2 +- src/database/tables/table-firewall.c | 5 +++-- src/stc-firewall.c | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 7 deletions(-) mode change 100644 => 100755 src/database/include/table-firewall.h mode change 100644 => 100755 src/database/tables/table-firewall.c mode change 100644 => 100755 src/stc-firewall.c diff --git a/src/database/include/table-firewall.h b/src/database/include/table-firewall.h old mode 100644 new mode 100755 index e15668f..70adca4 --- a/src/database/include/table-firewall.h +++ b/src/database/include/table-firewall.h @@ -39,7 +39,7 @@ stc_error_e table_firewall_foreach_chain(firewall_chain_cb info_cb, stc_error_e table_firewall_insert_rule(firewall_rule_s *info); stc_error_e table_firewall_delete_rule(firewall_rule_s *info); -stc_error_e table_firewall_update_rule(firewall_rule_s *info); +stc_error_e table_firewall_update_rule(firewall_rule_s *info, guint key); stc_error_e table_firewall_foreach_rule(firewall_rule_cb info_cb, void *user_data); diff --git a/src/database/tables/table-firewall.c b/src/database/tables/table-firewall.c old mode 100644 new mode 100755 index 3c811c7..d74acfc --- a/src/database/tables/table-firewall.c +++ b/src/database/tables/table-firewall.c @@ -69,7 +69,7 @@ "s_port_type = ?, d_port_type = ?, protocol = ?, family = ?, " \ "s_ip1 = ?, s_ip2 = ?, d_ip1 = ?, d_ip2 = ?, s_port1 = ?, " \ "s_port2 = ?, d_port1 = ?, d_port2 = ?, ifname = ?, " \ - "target = ?, identifier = ? " \ + "target = ?, identifier = ?, key = ? " \ "WHERE key = ?" /* INSERT statement */ @@ -645,7 +645,7 @@ handle_error: return error_code; } -stc_error_e table_firewall_update_rule(firewall_rule_s *info) +stc_error_e table_firewall_update_rule(firewall_rule_s *info, guint key) { stc_error_e error_code = STC_ERROR_NONE; char buf[BUF_SIZE_FOR_IP]; @@ -721,6 +721,7 @@ stc_error_e table_firewall_update_rule(firewall_rule_s *info) DB_ACTION(sqlite3_bind_text(stmt, 19, info->identifier ? info->identifier : "", -1, SQLITE_TRANSIENT)); DB_ACTION(sqlite3_bind_int64(stmt, 20, info->key)); + DB_ACTION(sqlite3_bind_int64(stmt, 21, key)); if (sqlite3_step(stmt) != SQLITE_DONE) { STC_LOGE("Failed to update firewall rule %s\n", diff --git a/src/stc-firewall.c b/src/stc-firewall.c old mode 100644 new mode 100755 index 236169b..ff4bc02 --- a/src/stc-firewall.c +++ b/src/stc-firewall.c @@ -190,9 +190,11 @@ static void __fw_rule_make_key(firewall_rule_s *rule, g_string_append_printf(str, "_%s", (rule->ifname) ? rule->ifname : ""); g_string_append_printf(str, "_%u", rule->target); + FREE(rule->identifier); rule->identifier = g_string_free(str, FALSE); rule->key = g_str_hash(rule->identifier); + FREE(info->identifier); info->identifier = g_strdup(rule->identifier); info->key = rule->key; @@ -728,6 +730,7 @@ static stc_error_e __fw_rule_add(firewall_rule_s *info) comp = g_slist_find_custom(lookup->rules, rule, __fw_rule_comp); if (comp) { STC_LOGD("rule already present"); + __fw_rule_free(rule); return STC_ERROR_ALREADY_DATA; } @@ -777,7 +780,8 @@ static stc_error_e __fw_rule_update(const firewall_rule_s *info) stc_fw_data_s *lookup; GSList *rule_list; GSList *comp; - firewall_rule_s *rule; + firewall_rule_s *origin_rule; + firewall_rule_s *update_rule; ret_value_msg_if(g_firewalls == NULL, STC_ERROR_FAIL, @@ -801,8 +805,29 @@ static stc_error_e __fw_rule_update(const firewall_rule_s *info) return STC_ERROR_NO_DATA; } - rule = comp->data; - __fw_rule_copy(rule, info); + origin_rule = comp->data; + + update_rule = MALLOC0(firewall_rule_s, 1); + if (!update_rule) { + STC_LOGE("rule allocation failed"); + return STC_ERROR_OUT_OF_MEMORY; + } + + memset(update_rule, 0, sizeof(firewall_rule_s)); + __fw_rule_copy(update_rule, info); + __fw_rule_make_key(update_rule, info); + + comp = g_slist_find_custom(lookup->rules, update_rule, __fw_rule_comp); + if (comp) { + STC_LOGD("rule already present"); + __fw_rule_free(update_rule); + return STC_ERROR_ALREADY_DATA; + } + + lookup->rules = g_slist_remove(lookup->rules, origin_rule); + __fw_rule_free(origin_rule); + + lookup->rules = g_slist_append(lookup->rules, update_rule); return STC_ERROR_NONE; } @@ -1486,6 +1511,7 @@ gboolean handle_firewall_update_rule(StcFirewall *object, __STC_LOG_FUNC_ENTER__; GVariantIter *iter = NULL; firewall_rule_s *rule; + guint key; int ret = STC_ERROR_NONE; STC_FIREWALL_CHECK_LOCK_STATE(invocation); @@ -1514,9 +1540,10 @@ gboolean handle_firewall_update_rule(StcFirewall *object, return TRUE; } + key = rule->key; ret = __fw_rule_update(rule); if (ret == STC_ERROR_NONE) { - table_firewall_update_rule(rule); + table_firewall_update_rule(rule, key); } else { __fw_rule_free(rule); STC_FIREWALL_DBUS_REPLY_ERROR(invocation, ret); -- 2.7.4