commit - f802d393d864dd33993acdeb9630fdb77859e192
commit + 1ad6438137396bda84b2f0af346e86190b8b87f1
blob - 158800305ebb991c7914716496654c43d6b3f9e6
blob + 905b0becbfdca60442dde7a3dadffd3d99a2db53
--- check_tcp.c
+++ check_tcp.c
-/* $OpenBSD: check_tcp.c,v 1.21 2007/02/07 15:13:00 reyk Exp $ */
+/* $OpenBSD: check_tcp.c,v 1.22 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
"tcp_read_buf: check failed");
return;
default:
- buf_add(cte->buf, rbuf, br);
+ if (buf_add(cte->buf, rbuf, br) == -1)
+ fatal("tcp_read_buf: buf_add error");
if (cte->validate_read != NULL) {
if (cte->validate_read(cte) != 0)
goto retry;
host->up = HOST_DOWN;
return (1);
}
- strlcpy(scode, head, sizeof(scode));
+ (void)strlcpy(scode, head, sizeof(scode));
code = strtonum(scode, 100, 999, &estr);
if (estr != NULL) {
log_debug("check_http_code: %s failed "
blob - 20e1cc04ff595fd980f420961389e4f8c1bcd1bd
blob + bfd318f45ea75a214aaca7859358c3ca9c847603
--- control.c
+++ control.c
-/* $OpenBSD: control.c,v 1.12 2007/02/07 13:39:58 reyk Exp $ */
+/* $OpenBSD: control.c,v 1.13 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
bzero(&sun, sizeof(sun));
sun.sun_family = AF_UNIX;
- strlcpy(sun.sun_path, HOSTSTATED_SOCKET, sizeof(sun.sun_path));
+ if (strlcpy(sun.sun_path, HOSTSTATED_SOCKET,
+ sizeof(sun.sun_path)) >= sizeof(sun.sun_path)) {
+ log_warn("control_init: %s name too long", HOSTSTATED_SOCKET);
+ close(fd);
+ return (-1);
+ }
if (unlink(HOSTSTATED_SOCKET) == -1)
if (errno != ENOENT) {
if (bind(fd, (struct sockaddr *)&sun, sizeof(sun)) == -1) {
log_warn("control_init: bind: %s", HOSTSTATED_SOCKET);
close(fd);
- umask(old_umask);
+ (void)umask(old_umask);
return (-1);
}
- umask(old_umask);
+ (void)umask(old_umask);
if (chmod(HOSTSTATED_SOCKET, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) {
log_warn("control_init: chmod");
void
control_cleanup(void)
{
-
- unlink(HOSTSTATED_SOCKET);
+ (void)unlink(HOSTSTATED_SOCKET);
}
/* ARGSUSED */
blob - fe81c4569aab98eb971b03e699d2ed99c092076d
blob + c5d53b444099f257dde98ca516434328787c1b77
--- parse.y
+++ parse.y
-/* $OpenBSD: parse.y,v 1.23 2007/02/07 15:17:46 reyk Exp $ */
+/* $OpenBSD: parse.y,v 1.24 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
}
table->check = CHECK_HTTP_CODE;
table->retcode = $5;
- asprintf(&table->sendbuf, "HEAD %s HTTP/1.0\r\n\r\n",
- $3);
+ if (asprintf(&table->sendbuf,
+ "HEAD %s HTTP/1.0\r\n\r\n", $3) == -1)
+ fatal("asprintf");
free($3);
if (table->sendbuf == NULL)
fatal("out of memory");
table->flags |= F_SSL;
}
table->check = CHECK_HTTP_DIGEST;
- asprintf(&table->sendbuf, "GET %s HTTP/1.0\r\n\r\n",
- $3);
+ if (asprintf(&table->sendbuf,
+ "GET %s HTTP/1.0\r\n\r\n", $3) == -1)
+ fatal("asprintf");
free($3);
if (table->sendbuf == NULL)
fatal("out of memory");
if ((sym = malloc(len)) == NULL)
errx(1, "cmdline_symset: malloc");
- strlcpy(sym, s, len);
+ if (strlcpy(sym, s, len) >= len)
+ errx(1, "cmdline_symset: macro too long");
ret = symset(sym, val + 1, 1);
free(sym);
blob - d02fbce1251d320ec3542fff822731281db03523
blob + 0af740996118c165ef5527bf9866f31833dd004a
--- pfe.c
+++ pfe.c
-/* $OpenBSD: pfe.c,v 1.13 2007/02/06 11:21:35 pyr Exp $ */
+/* $OpenBSD: pfe.c,v 1.14 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
event_add(&ibuf_main->ev, NULL);
TAILQ_INIT(&ctl_conns);
- control_listen();
+ if (control_listen() == -1)
+ fatalx("pfe: control socket listen failed");
+
event_dispatch();
pfe_shutdown();
blob - 060024f121900b54a624418396b54bee46c5cd82
blob + 6a38260d606f081c4bd5804e7c5b04a1dd42fae0
--- pfe_filter.c
+++ pfe_filter.c
-/* $OpenBSD: pfe_filter.c,v 1.11 2007/02/07 14:45:12 reyk Exp $ */
+/* $OpenBSD: pfe_filter.c,v 1.12 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
i = 0;
TAILQ_FOREACH(service, &env->services, entry) {
- (void)strlcpy(tables[i].pfrt_anchor, HOSTSTATED_ANCHOR "/",
- sizeof(tables[i].pfrt_anchor));
- (void)strlcat(tables[i].pfrt_anchor, service->name,
- sizeof(tables[i].pfrt_anchor));
- (void)strlcpy(tables[i].pfrt_name, service->name,
- sizeof(tables[i].pfrt_name));
+ if (strlcpy(tables[i].pfrt_anchor, HOSTSTATED_ANCHOR "/",
+ sizeof(tables[i].pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcat(tables[i].pfrt_anchor, service->name,
+ sizeof(tables[i].pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcpy(tables[i].pfrt_name, service->name,
+ sizeof(tables[i].pfrt_name)) >=
+ sizeof(tables[i].pfrt_name))
+ goto toolong;
tables[i].pfrt_flags |= PFR_TFLAG_PERSIST;
i++;
}
*/
TAILQ_FOREACH(service, &env->services, entry)
flush_table(env, service);
+
+ return;
+
+ toolong:
+ fatal("init_tables: name too long");
}
void
memset(&io, 0, sizeof(io));
TAILQ_FOREACH(service, &env->services, entry) {
- (void)strlcpy(io.pfrio_table.pfrt_anchor, HOSTSTATED_ANCHOR "/",
- sizeof(io.pfrio_table.pfrt_anchor));
- (void)strlcat(io.pfrio_table.pfrt_anchor, service->name,
- sizeof(io.pfrio_table.pfrt_anchor));
+ if (strlcpy(io.pfrio_table.pfrt_anchor, HOSTSTATED_ANCHOR "/",
+ sizeof(io.pfrio_table.pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcat(io.pfrio_table.pfrt_anchor, service->name,
+ sizeof(io.pfrio_table.pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
if (ioctl(env->pf->dev, DIOCRCLRTABLES, &io) == -1)
fatal("kill_tables: ioctl faile: ioctl failed");
}
log_debug("kill_tables: deleted %d tables", io.pfrio_ndel);
+ return;
+
+ toolong:
+ fatal("kill_tables: name too long");
}
void
io.pfrio_size = table->up;
io.pfrio_size2 = 0;
io.pfrio_buffer = addlist;
- (void)strlcpy(io.pfrio_table.pfrt_anchor, HOSTSTATED_ANCHOR "/",
- sizeof(io.pfrio_table.pfrt_anchor));
- (void)strlcat(io.pfrio_table.pfrt_anchor, service->name,
- sizeof(io.pfrio_table.pfrt_anchor));
- (void)strlcpy(io.pfrio_table.pfrt_name, service->name,
- sizeof(io.pfrio_table.pfrt_name));
+ if (strlcpy(io.pfrio_table.pfrt_anchor, HOSTSTATED_ANCHOR "/",
+ sizeof(io.pfrio_table.pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcat(io.pfrio_table.pfrt_anchor, service->name,
+ sizeof(io.pfrio_table.pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcpy(io.pfrio_table.pfrt_name, service->name,
+ sizeof(io.pfrio_table.pfrt_name)) >=
+ sizeof(io.pfrio_table.pfrt_name))
+ goto toolong;
i = 0;
TAILQ_FOREACH(host, &table->hosts, entry) {
log_debug("sync_table: table %s: %d added, %d deleted, %d changed",
io.pfrio_table.pfrt_name,
io.pfrio_nadd, io.pfrio_ndel, io.pfrio_nchange);
+ return;
+
+ toolong:
+ fatal("sync_table: name too long");
}
void
struct pfioc_table io;
memset(&io, 0, sizeof(io));
- (void)strlcpy(io.pfrio_table.pfrt_anchor, HOSTSTATED_ANCHOR "/",
- sizeof(io.pfrio_table.pfrt_anchor));
- (void)strlcat(io.pfrio_table.pfrt_anchor, service->name,
- sizeof(io.pfrio_table.pfrt_anchor));
- (void)strlcpy(io.pfrio_table.pfrt_name, service->name,
- sizeof(io.pfrio_table.pfrt_name));
+ if (strlcpy(io.pfrio_table.pfrt_anchor, HOSTSTATED_ANCHOR "/",
+ sizeof(io.pfrio_table.pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcat(io.pfrio_table.pfrt_anchor, service->name,
+ sizeof(io.pfrio_table.pfrt_anchor)) >= PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcpy(io.pfrio_table.pfrt_name, service->name,
+ sizeof(io.pfrio_table.pfrt_name)) >=
+ sizeof(io.pfrio_table.pfrt_name))
+ goto toolong;
if (ioctl(env->pf->dev, DIOCRCLRADDRS, &io) == -1)
fatal("flush_table: cannot flush table");
log_debug("flush_table: flushed table %s", service->name);
return;
+
+ toolong:
+ fatal("flush_table: name too long");
}
int
env->pf->pft.array = &env->pf->pfte;
memset(&env->pf->pfte, 0, sizeof env->pf->pfte);
- strlcpy(env->pf->pfte.anchor, anchor, PF_ANCHOR_NAME_SIZE);
+ (void)strlcpy(env->pf->pfte.anchor, anchor, PF_ANCHOR_NAME_SIZE);
env->pf->pfte.rs_num = PF_RULESET_RDR;
if (ioctl(env->pf->dev, DIOCXBEGIN, &env->pf->pft) == -1)
char anchor[PF_ANCHOR_NAME_SIZE];
bzero(anchor, sizeof(anchor));
- (void)strlcpy(anchor, HOSTSTATED_ANCHOR "/", sizeof(anchor));
- (void)strlcat(anchor, service->name, sizeof(anchor));
- transaction_init(env, anchor);
+ if (strlcpy(anchor, HOSTSTATED_ANCHOR "/", sizeof(anchor)) >=
+ PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcat(anchor, service->name, sizeof(anchor)) >=
+ PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (transaction_init(env, anchor) == -1) {
+ log_warn("sync_ruleset: transaction init failed");
+ return;
+ }
if (!enable) {
- transaction_commit(env);
- log_debug("sync_ruleset: rules removed");
+ if (transaction_commit(env) == -1)
+ log_warn("sync_ruleset: "
+ "remove rules transaction failed");
+ else
+ log_debug("sync_ruleset: rules removed");
return;
}
}
pio.addr.addr.type = PF_ADDR_TABLE;
- (void)strlcpy(pio.addr.addr.v.tblname, service->name,
- sizeof(pio.addr.addr.v.tblname));
+ if (strlcpy(pio.addr.addr.v.tblname, service->name,
+ sizeof(pio.addr.addr.v.tblname)) >= sizeof(pio.addr.addr.v.tblname))
+ fatal("sync_ruleset: table name too long");
if (ioctl(env->pf->dev, DIOCADDADDR, &pio) == -1)
fatal("sync_ruleset: cannot add address to pool");
fatal("cannot add rule");
log_debug("sync_ruleset: rule added");
}
- transaction_commit(env);
+ if (transaction_commit(env) == -1)
+ log_warn("sync_ruleset: add rules transaction failed");
+ return;
+
+ toolong:
+ fatal("sync_ruleset: name too long");
}
void
kill_tables(env);
TAILQ_FOREACH(service, &env->services, entry) {
- strlcpy(anchor, HOSTSTATED_ANCHOR "/", sizeof(anchor));
- strlcat(anchor, service->name, sizeof(anchor));
- transaction_init(env, anchor);
- transaction_commit(env);
+ if (strlcpy(anchor, HOSTSTATED_ANCHOR "/", sizeof(anchor)) >=
+ PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (strlcat(anchor, service->name, sizeof(anchor)) >=
+ PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (transaction_init(env, anchor) == -1 ||
+ transaction_commit(env) == -1)
+ log_warn("flush_rulesets: transaction for %s/ failed",
+ HOSTSTATED_ANCHOR);
}
- strlcpy(anchor, HOSTSTATED_ANCHOR, sizeof(anchor));
- transaction_init(env, anchor);
- transaction_commit(env);
+ if (strlcpy(anchor, HOSTSTATED_ANCHOR, sizeof(anchor)) >=
+ PF_ANCHOR_NAME_SIZE)
+ goto toolong;
+ if (transaction_init(env, anchor) == -1 ||
+ transaction_commit(env) == -1)
+ log_warn("flush_rulesets: transaction for %s failed",
+ HOSTSTATED_ANCHOR);
log_debug("flush_rulesets: flushed rules");
+ return;
+
+ toolong:
+ fatal("flush_rulesets: name too long");
}
blob - e0aa22192feb59c69e376027c8b4e49baceffc92
blob + 976029c0e43234143f5e969327b0a0385fbd7457
--- relayd.c
+++ relayd.c
-/* $OpenBSD: relayd.c,v 1.15 2007/02/07 13:30:17 reyk Exp $ */
+/* $OpenBSD: relayd.c,v 1.16 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
if (getpwnam(HOSTSTATED_USER) == NULL)
errx(1, "unknown user %s", HOSTSTATED_USER);
- if (!debug)
- daemon(1, 0);
+ if (!debug) {
+ if (daemon(1, 0) == -1)
+ err(1, "failed to daemonize");
+ }
log_info("startup");
blob - 87c887d5e218824d4e0e185980e25bfefa4723b2
blob + ddac5c5974c51976a73cf99a4cbb144dd4c0425a
--- ssl.c
+++ ssl.c
-/* $OpenBSD: ssl.c,v 1.5 2007/02/07 14:39:45 reyk Exp $ */
+/* $OpenBSD: ssl.c,v 1.6 2007/02/08 13:32:24 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
}
return;
}
- buf_add(cte->buf, rbuf, ret);
-
+ if (buf_add(cte->buf, rbuf, ret) == -1)
+ fatal("ssl_read: buf_add error");
if (cte->validate_read != NULL) {
if (cte->validate_read(cte) != 0)
goto retry;