mirror of
https://github.com/troglobit/finit.git
synced 2026-10-20 11:19:35 +00:00
Fix potential buffer overruns found by GCC 8.2
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
1 parent
67cd88cd23
commit
510b36645b
4 files changed
+24
-19
No files matched your search
@@ -96,7 +96,7 @@ static char query_buf[368];
|
||||
static int missing(char *job, int id)
|
||||
{
|
||||
char buf[20];
|
||||
char idstr[10] = "";
|
||||
char idstr[13] = "";
|
||||
|
||||
if (!job)
|
||||
job = "";
|
||||
|
||||
+1
-1
@@ -267,7 +267,7 @@ char *rlim2str(int rlim)
|
||||
|
||||
char *lim2str(struct rlimit *rlim)
|
||||
{
|
||||
char tmp[20];
|
||||
char tmp[25];
|
||||
static char buf[42];
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
+21
-16
@@ -43,12 +43,13 @@
|
||||
} while (0);
|
||||
|
||||
/* Peek into SOCK_DGRAM socket to figure out where an inbound packet comes from. */
|
||||
static int inetd_dgram_peek(int sd, char *ifname)
|
||||
static int inetd_dgram_peek(int sd, char *ifname, size_t len)
|
||||
{
|
||||
char cmbuf[0x100];
|
||||
struct msghdr msgh;
|
||||
struct cmsghdr *cmsg;
|
||||
struct msghdr msgh;
|
||||
char cmbuf[0x100];
|
||||
|
||||
memset(ifname, 0, len);
|
||||
memset(&msgh, 0, sizeof(msgh));
|
||||
msgh.msg_control = cmbuf;
|
||||
msgh.msg_controllen = sizeof(cmbuf);
|
||||
@@ -58,11 +59,13 @@ static int inetd_dgram_peek(int sd, char *ifname)
|
||||
|
||||
for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg; cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
|
||||
struct in_pktinfo *ipi = (struct in_pktinfo *)CMSG_DATA(cmsg);
|
||||
char tmp[IF_NAMESIZE + 1] = { 0 };
|
||||
|
||||
if (cmsg->cmsg_level != SOL_IP || cmsg->cmsg_type != IP_PKTINFO)
|
||||
continue;
|
||||
|
||||
if_indextoname(ipi->ipi_ifindex, ifname);
|
||||
if_indextoname(ipi->ipi_ifindex, tmp);
|
||||
strlcpy(ifname, tmp, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -73,11 +76,11 @@ static int inetd_dgram_peek(int sd, char *ifname)
|
||||
/* Peek into SOCK_DGRAM socket to figure out where an inbound packet comes from. */
|
||||
static void inetd_dgram_drop(int sd, const char *ifname)
|
||||
{
|
||||
char pkt_interface[17];
|
||||
char pkt_interface[IF_NAMESIZE + 1];
|
||||
char buf[BUFSIZ];
|
||||
|
||||
while (1) {
|
||||
inetd_dgram_peek(sd, pkt_interface);
|
||||
inetd_dgram_peek(sd, pkt_interface, sizeof(pkt_interface));
|
||||
if (string_compare(pkt_interface, ifname)) {
|
||||
if (recv(sd, buf, sizeof(buf), 0) < 0)
|
||||
break;
|
||||
@@ -88,12 +91,13 @@ static void inetd_dgram_drop(int sd, const char *ifname)
|
||||
}
|
||||
|
||||
/* Peek into SOCK_STREAM on accepted client socket to figure out inbound interface */
|
||||
static int inetd_stream_peek(int sd, char *ifname)
|
||||
static int inetd_stream_peek(int sd, char *ifname, size_t ilen)
|
||||
{
|
||||
struct ifaddrs *ifaddr, *ifa;
|
||||
struct sockaddr_in sin;
|
||||
socklen_t len = sizeof(sin);
|
||||
|
||||
memset(ifname, 0, ilen);
|
||||
if (-1 == getsockname(sd, (struct sockaddr *)&sin, &len))
|
||||
return -1;
|
||||
|
||||
@@ -112,7 +116,7 @@ static int inetd_stream_peek(int sd, char *ifname)
|
||||
|
||||
iin = (struct sockaddr_in *)ifa->ifa_addr;
|
||||
if (!memcmp(&sin.sin_addr, &iin->sin_addr, len)) {
|
||||
strncpy(ifname, ifa->ifa_name, IF_NAMESIZE);
|
||||
strlcpy(ifname, ifa->ifa_name, ilen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -122,11 +126,12 @@ static int inetd_stream_peek(int sd, char *ifname)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_stdin(svc_t *svc, char* iifname)
|
||||
static int get_stdin(svc_t *svc, char *iifname, size_t len)
|
||||
{
|
||||
int stdin = svc->inetd.watcher.fd;
|
||||
char ifname[IF_NAMESIZE] = "UNKNOWN";
|
||||
char ifname[IF_NAMESIZE + 1] = "UNKNOWN";
|
||||
|
||||
memset(iifname, 0, len);
|
||||
if (svc->inetd.type == SOCK_STREAM) {
|
||||
/* Open new client socket from server socket */
|
||||
stdin = accept(stdin, NULL, NULL);
|
||||
@@ -137,9 +142,9 @@ static int get_stdin(svc_t *svc, char* iifname)
|
||||
|
||||
_d("New client socket %d accepted for inetd service %d/tcp", stdin, svc->inetd.port);
|
||||
|
||||
inetd_stream_peek(stdin, ifname);
|
||||
inetd_stream_peek(stdin, ifname, sizeof(ifname));
|
||||
} else { /* SOCK_DGRAM */
|
||||
inetd_dgram_peek(stdin, ifname);
|
||||
inetd_dgram_peek(stdin, ifname, sizeof(ifname));
|
||||
}
|
||||
|
||||
if (!inetd_is_allowed(&svc->inetd, ifname)) {
|
||||
@@ -153,7 +158,7 @@ static int get_stdin(svc_t *svc, char* iifname)
|
||||
}
|
||||
|
||||
/* Return ingress interface */
|
||||
strncpy(iifname, ifname, IF_NAMESIZE);
|
||||
strlcpy(iifname, ifname, len);
|
||||
|
||||
return stdin;
|
||||
}
|
||||
@@ -163,7 +168,7 @@ static void socket_cb(uev_t *w, void *arg, int events)
|
||||
{
|
||||
svc_t *svc = (svc_t *)arg, *task;
|
||||
const char *conn = " connection";
|
||||
char iifname[IF_NAMESIZE] = "UNKNOWN";
|
||||
char iifname[IF_NAMESIZE + 1] = "UNKNOWN";
|
||||
int stdin;
|
||||
|
||||
_d("%s: Got socket event ...", svc->cmd);
|
||||
@@ -172,7 +177,7 @@ static void socket_cb(uev_t *w, void *arg, int events)
|
||||
return;
|
||||
}
|
||||
|
||||
stdin = get_stdin(svc, iifname);
|
||||
stdin = get_stdin(svc, iifname, sizeof(iifname));
|
||||
if (stdin < 0) {
|
||||
logit(LOG_CRIT, "%s: Unable to accept incoming connection", svc->cmd);
|
||||
return;
|
||||
@@ -220,7 +225,7 @@ static void socket_cb(uev_t *w, void *arg, int events)
|
||||
memcpy(task->args, svc->args, sizeof(task->args));
|
||||
strlcpy(task->desc, svc->desc, sizeof(task->desc) - strlen(conn));
|
||||
strlcat(task->desc, conn, sizeof(task->desc));
|
||||
strncpy(task->iifname, iifname, sizeof(task->iifname));
|
||||
strlcpy(task->iifname, iifname, sizeof(task->iifname));
|
||||
|
||||
task->stdin_fd = stdin;
|
||||
service_step(task);
|
||||
|
||||
@@ -112,7 +112,7 @@ typedef struct svc {
|
||||
/* For inetd services */
|
||||
inetd_t inetd;
|
||||
int stdin_fd;
|
||||
char iifname[IF_NAMESIZE]; /* Ingress interface for connection */
|
||||
char iifname[IF_NAMESIZE + 1]; /* Ingress interface for connection */
|
||||
|
||||
/* Set for services we need to redirect stdout/stderr to syslog */
|
||||
struct {
|
||||
|
||||
Reference in new issue
Block a user