summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbenno <benno@openbsd.org>2012-05-08 15:10:15 +0000
committerbenno <benno@openbsd.org>2012-05-08 15:10:15 +0000
commit1ac2a6baf136a69c50ad249458d42c38b96badef (patch)
treea02b976c5b55d919e55ccca6d5e4f2f12d0bca96
parentsync (diff)
downloadwireguard-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.c24
-rw-r--r--usr.sbin/relayd/parse.y3
-rw-r--r--usr.sbin/relayd/relayd.c7
-rw-r--r--usr.sbin/relayd/relayd.h4
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;