summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2008-09-13 09:17:02 +0000
committerAlexander Motin <mav@FreeBSD.org>2008-09-13 09:17:02 +0000
commit74c9119d4a985d841285abd262c5f3d06e7c5e18 (patch)
treec152f620d259d537de1b38daa97ab72b77b6ba29
parentd56bc17bcea59253e909583b9717898433be1478 (diff)
Notes
-rw-r--r--sys/netgraph/ng_base.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index b41d57da1f92..4012e358cce4 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -2365,19 +2365,27 @@ ng_apply_item(node_p node, item_p item, int rw)
case NGQF_FN:
case NGQF_FN2:
/*
- * We have to implicitly trust the hook,
- * as some of these are used for system purposes
- * where the hook is invalid. In the case of
- * the shutdown message we allow it to hit
+ * In the case of the shutdown message we allow it to hit
* even if the node is invalid.
*/
- if ((NG_NODE_NOT_VALID(node))
- && (NGI_FN(item) != &ng_rmnode)) {
+ if (NG_NODE_NOT_VALID(node) &&
+ NGI_FN(item) != &ng_rmnode) {
TRAP_ERROR();
error = EINVAL;
NG_FREE_ITEM(item);
break;
}
+ /* Same is about some internal functions and invalid hook. */
+ if (hook && NG_HOOK_NOT_VALID(hook) &&
+ NGI_FN2(item) != &ng_con_part2 &&
+ NGI_FN2(item) != &ng_con_part3 &&
+ NGI_FN(item) != &ng_rmhook_part2) {
+ TRAP_ERROR();
+ error = EINVAL;
+ NG_FREE_ITEM(item);
+ break;
+ }
+
if ((item->el_flags & NGQF_TYPE) == NGQF_FN) {
(*NGI_FN(item))(node, hook, NGI_ARG1(item),
NGI_ARG2(item));