Modified to update firewall rule 33/184033/1
authorhyunuktak <hyunuk.tak@samsung.com>
Fri, 13 Jul 2018 06:46:36 +0000 (15:46 +0900)
committerhyunuktak <hyunuk.tak@samsung.com>
Fri, 13 Jul 2018 06:46:41 +0000 (15:46 +0900)
Change-Id: I0a452c3e7eea1a33f93f7a39df182d9e77c01ced
Signed-off-by: hyunuktak <hyunuk.tak@samsung.com>
src/database/include/table-firewall.h [changed mode: 0644->0755]
src/database/tables/table-firewall.c [changed mode: 0644->0755]
src/stc-firewall.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index e15668f..70adca4
@@ -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);
 
old mode 100644 (file)
new mode 100755 (executable)
index 3c811c7..d74acfc
@@ -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",
old mode 100644 (file)
new mode 100755 (executable)
index 236169b..ff4bc02
@@ -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);