Project

General

Profile

Bug #16540 ยป cppatch_25.07.1.txt

Marcos M, 11/19/2025 08:23 PM

 
diff --git a/src/etc/inc/captiveportal.inc b/src/etc/inc/captiveportal.inc
index fb8086444b..4f95e5df48 100644
--- a/src/etc/inc/captiveportal.inc
+++ b/src/etc/inc/captiveportal.inc
@@ -1020,6 +1020,7 @@ function captiveportal_passthrumac_delete_entry($macent) {
if ($macent['action'] == 'pass') {
$pipes = captiveportal_get_dn_passthru_pipes($macent['mac']);
if (!empty($pipes)) {
+ // passthrumac should always have 2 pipes, one each for 'ether in' and 'ether out'.
captiveportal_pipes_delete($pipes);
}
} else {
@@ -1088,6 +1089,14 @@ function captiveportal_ether_delete_entry($hostent, $anchor = 'allowedhosts') {
$pipes = pfSense_pf_cp_get_eth_pipes("{$cpzoneprefix}_{$anchor}/{$host}");
if (!empty($pipes)) {
+ // 2 pipes are reserved per entry; keep the reservation list aligned when a rule is created for a single direction.
+ if (count($pipes) == 1) {
+ if ($hostent['dir'] == 'to') {
+ $pipes[array_key_last($pipes) + 1] = $pipes[array_key_last($pipes)] + 1;
+ } elseif ($hostent['dir'] == 'from') {
+ $pipes[array_key_last($pipes) + 1] = $pipes[array_key_last($pipes)] - 1;
+ }
+ }
captiveportal_pipes_delete($pipes);
}
/* flush anchor rules */
@@ -2590,6 +2599,14 @@ function captiveportal_allowedhostname_cleanup() {
$pipes = pfSense_pf_cp_get_eth_pipes("{$cpzoneprefix}_allowedhosts/hostname_{$id}");
pfSense_pf_cp_flush("{$cpzoneprefix}_allowedhosts/hostname_{$id}", "ether");
if (!empty($pipes)) {
+ // 2 pipes are reserved per entry; keep the reservation list aligned when a rule is created for a single direction.
+ if (count($pipes) == 1) {
+ if ($hostnameent['dir'] == 'to') {
+ $pipes[array_key_last($pipes) + 1] = $pipes[array_key_last($pipes)] + 1;
+ } elseif ($hostnameent['dir'] == 'from') {
+ $pipes[array_key_last($pipes) + 1] = $pipes[array_key_last($pipes)] - 1;
+ }
+ }
captiveportal_pipes_delete($pipes);
}
}
diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc
index f78531488e..d93089267d 100644
--- a/src/etc/inc/system.inc
+++ b/src/etc/inc/system.inc
@@ -3051,18 +3051,21 @@ function system_reboot_cleanup() {
mwexec("/usr/local/bin/beep.sh stop");
require_once("captiveportal.inc");
$cps = config_get_path('captiveportal', []);
+ $preservedb = false;
foreach ($cps as $cpzone=>$cp) {
if (!isset($cp['preservedb'])) {
/* send Accounting-Stop packet for all clients, termination cause 'Admin-Reboot' */
captiveportal_radius_stop_all(7); // Admin-Reboot
unlink_if_exists("{$g['vardb_path']}/captiveportal{$cpzone}.db");
captiveportal_free_dnrules();
+ } else {
+ $preservedb = true;
}
/* Send Accounting-Off packet to the RADIUS server */
captiveportal_send_server_accounting('off');
}
- if (count($cps)> 0) {
+ if (!$preservedb) {
/* Remove the pipe database */
unlink_if_exists("{$g['vardb_path']}/captiveportaldn.rules");
}
diff --git a/src/etc/rc.carpmaster b/src/etc/rc.carpmaster
index fde3e22054..cf8f251f8b 100755
--- a/src/etc/rc.carpmaster
+++ b/src/etc/rc.carpmaster
@@ -149,7 +149,11 @@ if (!empty(config_get_path('captiveportal')) &&
}
}
- foreach (array_keys(config_get_path('captiveportal', [])) as $cpzone) {
+ foreach (config_get_path('captiveportal', []) as $cpzone => $cpzone_config) {
+ if ($cpzone_config['interface'] != $friendly) {
+ // Ignore CARP events for unrelated interfaces.
+ continue;
+ }
$rpc_client = new pfsense_xmlrpc_client();
$rpc_client->setConnectionData(config_get_path('hasync/synchronizetoip'), $xmlrpc_port, $xmlrpc_username, config_get_path('hasync/password'));
$resp = $rpc_client->xmlrpc_method('captive_portal_sync', array('op' => 'get_databases', 'zone' => $cpzone));
@@ -169,7 +173,8 @@ if (!empty(config_get_path('captiveportal')) &&
if (!empty($unsetindexes)) {
captiveportal_remove_entries($unsetindexes, true); // true: prevent carp loop
}
- captiveportal_free_dnrules();
+ // Make sure the passthrumac, ip, and hostname entries are added; clear the rest.
+ captiveportal_init_rules(true);
foreach ($connected_users as $user) {
if (!is_array($user) || empty($user)) {
diff --git a/src/usr/local/www/services_captiveportal_ip_edit.php b/src/usr/local/www/services_captiveportal_ip_edit.php
index e1de2da60e..b8ce3f88bb 100644
--- a/src/usr/local/www/services_captiveportal_ip_edit.php
+++ b/src/usr/local/www/services_captiveportal_ip_edit.php
@@ -135,15 +135,7 @@ if ($_POST['save']) {
$ip['bw_down'] = $_POST['bw_down'];
}
- $oldip = array();
if ($this_allowedip_config) {
- $oldip['ip'] = $this_allowedip_config['ip'];
- if (!empty($this_allowedip_config['sn'])) {
- $oldip['sn'] = $this_allowedip_config['sn'];
- } else {
- $oldip['sn'] = 32;
- }
-
config_set_path("captiveportal/{$cpzone}/allowedip/{$id}", $ip);
} else {
config_set_path("captiveportal/{$cpzone}/allowedip/", $ip);
@@ -154,8 +146,8 @@ if ($_POST['save']) {
write_config("Captive portal allowed IPs added");
if (config_path_enabled("captiveportal/{$cpzone}")) {
- if (!empty($oldip)) {
- captiveportal_ether_delete_entry($oldip, 'allowedhosts');
+ if ($this_allowedip_config) {
+ captiveportal_ether_delete_entry($this_allowedip_config, 'allowedhosts');
}
captiveportal_allowedip_configure_entry($ip);
}
    (1-1/1)