@@ -218,10 +218,14 @@ static void tlshd_parse_certificate(struct tlshd_handshake_parms *parms,
218218 parms -> x509_privkey = nla_get_u32 (tb [HANDSHAKE_A_X509_PRIVKEY ]);
219219}
220220
221+ static char tlshd_peername [NI_MAXHOST ] = "unknown" ;
222+ static struct sockaddr_storage tlshd_peeraddr ;
223+
221224static int tlshd_genl_valid_handler (struct nl_msg * msg , void * arg )
222225{
223226 struct nlattr * tb [HANDSHAKE_A_ACCEPT_MAX + 1 ];
224227 struct tlshd_handshake_parms * parms = arg ;
228+ char * peername = NULL ;
225229 int err ;
226230
227231 tlshd_log_debug ("Parsing a valid netlink message\n" );
@@ -233,12 +237,18 @@ static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
233237 return NL_STOP ;
234238 }
235239
236- if (tb [HANDSHAKE_A_ACCEPT_SOCKFD ])
240+ if (tb [HANDSHAKE_A_ACCEPT_SOCKFD ]) {
237241 parms -> sockfd = nla_get_u32 (tb [HANDSHAKE_A_ACCEPT_SOCKFD ]);
242+ if (getpeername (parms -> sockfd , parms -> peeraddr ,
243+ & parms -> peeraddr_len ) == -1 ) {
244+ tlshd_log_perror ("getpeername" );
245+ return NL_STOP ;
246+ }
247+ }
238248 if (tb [HANDSHAKE_A_ACCEPT_MESSAGE_TYPE ])
239249 parms -> handshake_type = nla_get_u32 (tb [HANDSHAKE_A_ACCEPT_MESSAGE_TYPE ]);
240250 if (tb [HANDSHAKE_A_ACCEPT_PEERNAME ])
241- parms -> peername = nla_get_string (tb [HANDSHAKE_A_ACCEPT_PEERNAME ]);
251+ peername = nla_get_string (tb [HANDSHAKE_A_ACCEPT_PEERNAME ]);
242252 if (tb [HANDSHAKE_A_ACCEPT_TIMEOUT ])
243253 parms -> timeout_ms = nla_get_u32 (tb [HANDSHAKE_A_ACCEPT_TIMEOUT ]);
244254 if (tb [HANDSHAKE_A_ACCEPT_AUTH_MODE ])
@@ -247,11 +257,25 @@ static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
247257 tlshd_parse_peer_identity (parms , tb [HANDSHAKE_A_ACCEPT_PEER_IDENTITY ]);
248258 tlshd_parse_certificate (parms , tb [HANDSHAKE_A_ACCEPT_CERTIFICATE ]);
249259
260+ if (peername )
261+ strcpy (tlshd_peername , peername );
262+ else {
263+ err = getnameinfo (parms -> peeraddr , parms -> peeraddr_len ,
264+ tlshd_peername , sizeof (tlshd_peername ),
265+ NULL , 0 , NI_NAMEREQD );
266+ if (err ) {
267+ tlshd_log_gai_error (err );
268+ return NL_STOP ;
269+ }
270+ }
271+
250272 return NL_SKIP ;
251273}
252274
253275static const struct tlshd_handshake_parms tlshd_default_handshake_parms = {
254- .peername = NULL ,
276+ .peername = tlshd_peername ,
277+ .peeraddr = (struct sockaddr * )& tlshd_peeraddr ,
278+ .peeraddr_len = sizeof (tlshd_peeraddr ),
255279 .sockfd = -1 ,
256280 .handshake_type = HANDSHAKE_MSG_TYPE_UNSPEC ,
257281 .timeout_ms = GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT ,
0 commit comments