diff options
author | 2012-05-08 15:10:15 +0000 | |
---|---|---|
committer | 2012-05-08 15:10:15 +0000 | |
commit | 1ac2a6baf136a69c50ad249458d42c38b96badef (patch) | |
tree | a02b976c5b55d919e55ccca6d5e4f2f12d0bca96 | |
parent | sync (diff) | |
download | wireguard-openbsd-1ac2a6baf136a69c50ad249458d42c38b96badef.tar.xz wireguard-openbsd-1ac2a6baf136a69c50ad249458d42c38b96badef.zip |
fix "label string" in http protocol. problem found by giovanni.
ok giovanni@, henning@
-rw-r--r-- | usr.sbin/relayd/config.c | 24 | ||||
-rw-r--r-- | usr.sbin/relayd/parse.y | 3 | ||||
-rw-r--r-- | usr.sbin/relayd/relayd.c | 7 | ||||
-rw-r--r-- | usr.sbin/relayd/relayd.h | 4 |
4 files changed, 32 insertions, 6 deletions
diff --git a/usr.sbin/relayd/config.c b/usr.sbin/relayd/config.c index ef185dc52d9..eb41bc57c15 100644 --- a/usr.sbin/relayd/config.c +++ b/usr.sbin/relayd/config.c @@ -1,4 +1,4 @@ -/* $OpenBSD: config.c,v 1.2 2011/05/19 09:13:07 reyk Exp $ */ +/* $OpenBSD: config.c,v 1.3 2012/05/08 15:10:15 benno Exp $ */ /* * Copyright (c) 2011 Reyk Floeter <reyk@openbsd.org> @@ -671,8 +671,12 @@ config_setprotonode(struct relayd *env, enum privsep_procid id, pn->conf.dir = dir; pn->conf.keylen = pn->key ? strlen(pn->key) : 0; pn->conf.valuelen = pn->value ? strlen(pn->value) : 0; + if (pn->label != 0 && pn->labelname == NULL) + pn->labelname = strdup(pn_id2name(pn->label)); + pn->conf.labelnamelen = pn->labelname ? strlen(pn->labelname) : 0; + pn->conf.len = sizeof(*pn) + - pn->conf.keylen + pn->conf.valuelen; + pn->conf.keylen + pn->conf.valuelen + pn->conf.labelnamelen; if (pn->conf.len > (MAX_IMSGSIZE - IMSG_HEADER_SIZE)) return (-1); @@ -694,6 +698,10 @@ config_setprotonode(struct relayd *env, enum privsep_procid id, iov[c].iov_base = pn->value; iov[c++].iov_len = pn->conf.valuelen; } + if (pn->conf.labelnamelen) { + iov[c].iov_base = pn->labelname; + iov[c++].iov_len = pn->conf.labelnamelen; + } sz += pn->conf.len; } } @@ -726,7 +734,7 @@ config_getprotonode(struct relayd *env, struct imsg *imsg) return (-1); } - pn.key = pn.value = NULL; + pn.key = pn.value = pn.labelname = NULL; bzero(&pn.entry, sizeof(pn.entry)); bzero(&pn.nodes, sizeof(pn.nodes)); bzero(&pn.head, sizeof(pn.head)); @@ -749,12 +757,22 @@ config_getprotonode(struct relayd *env, struct imsg *imsg) } s += pn.conf.valuelen; } + if (pn.conf.labelnamelen) { + if ((pn.labelname = get_string(p + s, + pn.conf.labelnamelen)) == NULL) { + log_debug("%s: failed to get labelname", __func__); + return (-1); + } + s += pn.conf.labelnamelen; + } if (protonode_add(pn.conf.dir, proto, &pn) == -1) { if (pn.key != NULL) free(pn.key); if (pn.value != NULL) free(pn.value); + if (pn.labelname != NULL) + free(pn.labelname); log_debug("%s: failed to add protocol node", __func__); return (-1); } diff --git a/usr.sbin/relayd/parse.y b/usr.sbin/relayd/parse.y index a45c43692e2..829bbf7cb4e 100644 --- a/usr.sbin/relayd/parse.y +++ b/usr.sbin/relayd/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.162 2012/04/15 03:12:30 jsg Exp $ */ +/* $OpenBSD: parse.y,v 1.163 2012/05/08 15:10:15 benno Exp $ */ /* * Copyright (c) 2007-2011 Reyk Floeter <reyk@openbsd.org> @@ -867,6 +867,7 @@ protoptsl : SSL sslflags } | direction { node.label = label; + node.labelname = NULL; nodedirection = $1; } protonode { if (nodedirection != -1 && diff --git a/usr.sbin/relayd/relayd.c b/usr.sbin/relayd/relayd.c index dd3410916ad..b369e2549de 100644 --- a/usr.sbin/relayd/relayd.c +++ b/usr.sbin/relayd/relayd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: relayd.c,v 1.107 2012/04/15 03:12:30 jsg Exp $ */ +/* $OpenBSD: relayd.c,v 1.108 2012/05/08 15:10:15 benno Exp $ */ /* * Copyright (c) 2007, 2008 Reyk Floeter <reyk@openbsd.org> @@ -523,6 +523,8 @@ purge_tree(struct proto_tree *tree) free(pn->key); if (pn->value != NULL) free(pn->value); + if (pn->labelname != NULL) + free(pn->labelname); if (pn->label != 0) pn_unref(pn->label); free(pn); @@ -989,6 +991,9 @@ protonode_add(enum direction dir, struct protocol *proto, bcopy(node, pn, sizeof(*pn)); pn->key = node->key; pn->value = node->value; + pn->labelname = NULL; + if (node->labelname != NULL) + pn->label = pn_name2id(node->labelname); SIMPLEQ_INIT(&pn->head); if (dir == RELAY_DIR_RESPONSE) pn->id = proto->response_nodes++; diff --git a/usr.sbin/relayd/relayd.h b/usr.sbin/relayd/relayd.h index 96bcc8476a8..c34c1e52580 100644 --- a/usr.sbin/relayd/relayd.h +++ b/usr.sbin/relayd/relayd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: relayd.h,v 1.153 2012/04/11 08:25:26 deraadt Exp $ */ +/* $OpenBSD: relayd.h,v 1.154 2012/05/08 15:10:15 benno Exp $ */ /* * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org> @@ -478,6 +478,7 @@ struct protonode_config { size_t keylen; size_t valuelen; size_t len; + size_t labelnamelen; u_int dir; }; @@ -490,6 +491,7 @@ struct protonode { u_int16_t mark; u_int16_t label; + char *labelname; char *key; char *value; |