Check type of sockets passed-in by systemd(8)
This patch makes sure that ngIRCd doesn't try to handle sockets of unsupported types, for example of AF_INET6 sockets when ngIRCd isn't compiled with support for IPv6 ...
This commit is contained in:
parent
a78c7b3898
commit
5c6875d768
|
@ -532,8 +532,9 @@ Conn_InitListeners( void )
|
||||||
{
|
{
|
||||||
/* Initialize ports on which the server should accept connections */
|
/* Initialize ports on which the server should accept connections */
|
||||||
unsigned int created = 0;
|
unsigned int created = 0;
|
||||||
char *copy, *listen_addr;
|
char *af_str, *copy, *listen_addr;
|
||||||
int count, fd, i;
|
int count, fd, i, addr_len;
|
||||||
|
ng_ipaddr_t addr;
|
||||||
|
|
||||||
assert(Conf_ListenAddress);
|
assert(Conf_ListenAddress);
|
||||||
|
|
||||||
|
@ -549,6 +550,36 @@ Conn_InitListeners( void )
|
||||||
LogDebug("Initializing %d systemd sockets ...", count);
|
LogDebug("Initializing %d systemd sockets ...", count);
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
fd = SD_LISTEN_FDS_START + i;
|
fd = SD_LISTEN_FDS_START + i;
|
||||||
|
addr_len = (int)sizeof(addr);
|
||||||
|
getsockname(fd, (struct sockaddr *)&addr, (socklen_t*)&addr_len);
|
||||||
|
#ifdef WANT_IPV6
|
||||||
|
if (addr.sin4.sin_family != AF_INET && addr.sin4.sin_family != AF_INET6)
|
||||||
|
#else
|
||||||
|
if (addr.sin4.sin_family != AF_INET)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/* Socket is of unsupported type! For example, systemd passed in
|
||||||
|
* an IPv6 socket but ngIRCd isn't compiled with IPv6 support. */
|
||||||
|
switch (addr.sin4.sin_family)
|
||||||
|
{
|
||||||
|
case AF_UNSPEC: af_str = "AF_UNSPEC"; break;
|
||||||
|
case AF_UNIX: af_str = "AF_UNIX"; break;
|
||||||
|
case AF_INET: af_str = "AF_INET"; break;
|
||||||
|
#ifdef AF_INET6
|
||||||
|
case AF_INET6: af_str = "AF_INET6"; break;
|
||||||
|
#endif
|
||||||
|
#ifdef AF_NETLINK
|
||||||
|
case AF_NETLINK: af_str = "AF_NETLINK"; break;
|
||||||
|
#endif
|
||||||
|
default: af_str = "unknown"; break;
|
||||||
|
}
|
||||||
|
Log(LOG_CRIT,
|
||||||
|
"Socket %d is of unsupported type \"%s\" (%d), have to ignore it!",
|
||||||
|
fd, af_str, addr.sin4.sin_family);
|
||||||
|
close(fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Init_Socket(fd);
|
Init_Socket(fd);
|
||||||
if (!io_event_create(fd, IO_WANTREAD, cb_listen)) {
|
if (!io_event_create(fd, IO_WANTREAD, cb_listen)) {
|
||||||
Log(LOG_ERR,
|
Log(LOG_ERR,
|
||||||
|
|
Loading…
Reference in New Issue