Changeset View
Changeset View
Standalone View
Standalone View
sys/netpfil/pf/pf_ioctl.c
Show First 20 Lines • Show All 2,547 Lines • ▼ Show 20 Lines | DIOCGETETHRULES_error: | ||||
case DIOCGETETHRULE: { | case DIOCGETETHRULE: { | ||||
struct epoch_tracker et; | struct epoch_tracker et; | ||||
struct pfioc_nv *nv = (struct pfioc_nv *)addr; | struct pfioc_nv *nv = (struct pfioc_nv *)addr; | ||||
nvlist_t *nvl = NULL; | nvlist_t *nvl = NULL; | ||||
void *nvlpacked = NULL; | void *nvlpacked = NULL; | ||||
struct pf_keth_rule *rule = NULL; | struct pf_keth_rule *rule = NULL; | ||||
u_int32_t ticket, nr; | u_int32_t ticket, nr; | ||||
bool clear = false; | |||||
#define ERROUT(x) do { error = (x); goto DIOCGETETHRULE_error; } while (0) | #define ERROUT(x) do { error = (x); goto DIOCGETETHRULE_error; } while (0) | ||||
nvlpacked = malloc(nv->len, M_TEMP, M_WAITOK); | nvlpacked = malloc(nv->len, M_TEMP, M_WAITOK); | ||||
if (nvlpacked == NULL) | if (nvlpacked == NULL) | ||||
ERROUT(ENOMEM); | ERROUT(ENOMEM); | ||||
error = copyin(nv->data, nvlpacked, nv->len); | error = copyin(nv->data, nvlpacked, nv->len); | ||||
if (error) | if (error) | ||||
ERROUT(error); | ERROUT(error); | ||||
nvl = nvlist_unpack(nvlpacked, nv->len, 0); | nvl = nvlist_unpack(nvlpacked, nv->len, 0); | ||||
if (! nvlist_exists_number(nvl, "ticket")) | if (! nvlist_exists_number(nvl, "ticket")) | ||||
ERROUT(EBADMSG); | ERROUT(EBADMSG); | ||||
ticket = nvlist_get_number(nvl, "ticket"); | ticket = nvlist_get_number(nvl, "ticket"); | ||||
if (nvlist_exists_bool(nvl, "clear")) { | |||||
clear = nvlist_get_bool(nvl, "clear"); | |||||
} | |||||
if (clear && !(flags & FWRITE)) | |||||
ERROUT(EACCES); | |||||
if (! nvlist_exists_number(nvl, "nr")) | if (! nvlist_exists_number(nvl, "nr")) | ||||
ERROUT(EBADMSG); | ERROUT(EBADMSG); | ||||
nr = nvlist_get_number(nvl, "nr"); | nr = nvlist_get_number(nvl, "nr"); | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
nvl = NULL; | nvl = NULL; | ||||
free(nvlpacked, M_TEMP); | free(nvlpacked, M_TEMP); | ||||
nvlpacked = NULL; | nvlpacked = NULL; | ||||
Show All 25 Lines | if (nvlpacked == NULL) | ||||
ERROUT(ENOMEM); | ERROUT(ENOMEM); | ||||
if (nv->size == 0) | if (nv->size == 0) | ||||
ERROUT(0); | ERROUT(0); | ||||
else if (nv->size < nv->len) | else if (nv->size < nv->len) | ||||
ERROUT(ENOSPC); | ERROUT(ENOSPC); | ||||
error = copyout(nvlpacked, nv->data, nv->len); | error = copyout(nvlpacked, nv->data, nv->len); | ||||
if (error == 0 && clear) { | |||||
counter_u64_zero(rule->evaluations); | |||||
for (int i = 0; i < 2; i++) { | |||||
counter_u64_zero(rule->packets[i]); | |||||
counter_u64_zero(rule->bytes[i]); | |||||
} | |||||
} | |||||
#undef ERROUT | #undef ERROUT | ||||
DIOCGETETHRULE_error: | DIOCGETETHRULE_error: | ||||
free(nvlpacked, M_TEMP); | free(nvlpacked, M_TEMP); | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
break; | break; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 3,796 Lines • Show Last 20 Lines |