Skip to content

Commit 808a57f

Browse files
committed
tlshd: Dynamically allocate hostname
Ensure that, when allocation or DNS query fails, parms->peername always remains NULL. tlshd should not assume that the buffer returned from getnameinfo(3) will remain untouched if that call is unsuccessful. Fixes: 7655d96 ("tlshd: Move peername/peeraddr preparation") Reported-by: Ken Milmore <[email protected]> Signed-off-by: Chuck Lever <[email protected]>
1 parent 484b63c commit 808a57f

File tree

2 files changed

+8
-7
lines changed

2 files changed

+8
-7
lines changed

src/tlshd/log.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void tlshd_log_completion(struct tlshd_handshake_parms *parms)
6161
status = "failed";
6262
priority = LOG_ERR;
6363
}
64-
if (parms->peeraddr)
64+
if (parms->peername && parms->peeraddr)
6565
syslog(priority, "Handshake with '%s' (%s) %s\n",
6666
parms->peername, parms->peeraddr, status);
6767
else

src/tlshd/netlink.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,6 @@ static void tlshd_parse_certificate(struct tlshd_handshake_parms *parms,
232232
parms->x509_privkey = nla_get_s32(tb[HANDSHAKE_A_X509_PRIVKEY]);
233233
}
234234

235-
static char tlshd_peername[NI_MAXHOST] = "unknown";
236-
237235
static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
238236
{
239237
struct nlattr *tb[HANDSHAKE_A_ACCEPT_MAX + 1];
@@ -304,22 +302,24 @@ static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
304302
tlshd_parse_certificate(parms, tb[HANDSHAKE_A_ACCEPT_CERTIFICATE]);
305303

306304
if (peername)
307-
strncpy(tlshd_peername, peername, sizeof(tlshd_peername) - 1);
305+
parms->peername = strdup(peername);
308306
else if (sap) {
309-
err = getnameinfo(sap, salen,
310-
tlshd_peername, sizeof(tlshd_peername),
307+
char buf[NI_MAXHOST];
308+
309+
err = getnameinfo(sap, salen, buf, sizeof(buf),
311310
NULL, 0, NI_NAMEREQD);
312311
if (err) {
313312
tlshd_log_gai_error(err);
314313
return NL_STOP;
315314
}
315+
parms->peername = strdup(buf);
316316
}
317317

318318
return NL_SKIP;
319319
}
320320

321321
static const struct tlshd_handshake_parms tlshd_default_handshake_parms = {
322-
.peername = tlshd_peername,
322+
.peername = NULL,
323323
.peeraddr = NULL,
324324
.sockfd = -1,
325325
.ip_proto = -1,
@@ -426,6 +426,7 @@ void tlshd_genl_put_handshake_parms(struct tlshd_handshake_parms *parms)
426426
keyctl_unlink(parms->keyring, KEY_SPEC_SESSION_KEYRING);
427427
g_array_free(parms->peerids, TRUE);
428428
g_array_free(parms->remote_peerids, TRUE);
429+
free(parms->peername);
429430
free(parms->peeraddr);
430431
}
431432

0 commit comments

Comments
 (0)