"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 */
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];
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",
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;
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;
}
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,
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;
}
__STC_LOG_FUNC_ENTER__;
GVariantIter *iter = NULL;
firewall_rule_s *rule;
+ guint key;
int ret = STC_ERROR_NONE;
STC_FIREWALL_CHECK_LOCK_STATE(invocation);
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);