Project

General

Profile

« Previous | Next » 

Revision 8451d0a9

Added by Renato Botelho almost 8 years ago

Fix #7834: Delete IPFW pipes when disable Captive Portal zone

View differences:

src/etc/inc/captiveportal.inc
356 356
		unlink_if_exists("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db");
357 357
		unlink_if_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules");
358 358
		/* Release allocated pipes for this zone */
359
		captiveportal_free_dnrules();
359
		$pipes_to_remove = captiveportal_free_dnrules();
360 360

  
361
		captiveportal_delete_rules();
361
		captiveportal_delete_rules($pipes_to_remove);
362 362

  
363 363
		if (empty($config['captiveportal'])) {
364 364
			set_single_sysctl("net.link.ether.ipfw", "0");
......
687 687
}
688 688

  
689 689
/* Delete all rules related to specific cpzone */
690
function captiveportal_delete_rules() {
690
function captiveportal_delete_rules($pipes_to_remove = array()) {
691 691
	global $g, $cpzoneid, $cpzone;
692 692

  
693 693
	$skipto1 = captiveportal_ipfw_ruleno($cpzoneid);
......
715 715
		$delrules .= "table {$table} destroy\n";
716 716
	}
717 717

  
718
	foreach ($pipes_to_remove as $pipeno) {
719
		$delrules .= "pipe delete {$pipeno}\n";
720
	}
721

  
718 722
	if (empty($delrules)) {
719 723
		return;
720 724
	}
......
1764 1768
function captiveportal_free_dnrules($rulenos_start = 2000, $rulenos_range_max = 64500) {
1765 1769
	global $g, $cpzone;
1766 1770

  
1771
	$removed_pipes = array();
1772

  
1767 1773
	$cpruleslck = lock("captiveportalrulesdn", LOCK_EX);
1768 1774
	if (file_exists("{$g['vardb_path']}/captiveportaldn.rules")) {
1769 1775
		$rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportaldn.rules"));
......
1771 1777
		while ($ridx < $rulenos_range_max) {
1772 1778
			if ($rules[$ridx] == $cpzone) {
1773 1779
				$rules[$ridx] = false;
1780
				$removed_pipes[] = $ridx;
1774 1781
				$ridx++;
1775 1782
				$rules[$ridx] = false;
1783
				$removed_pipes[] = $ridx;
1776 1784
				$ridx++;
1777 1785
			} else {
1778 1786
				$ridx += 2;
......
1782 1790
		unset($rules);
1783 1791
	}
1784 1792
	unlock($cpruleslck);
1793

  
1794
	return $removed_pipes;
1785 1795
}
1786 1796

  
1787 1797
function captiveportal_get_next_dn_ruleno($rulenos_start = 2000, $rulenos_range_max = 64500) {

Also available in: Unified diff