@@ -233,14 +233,15 @@ static void tlshd_parse_certificate(struct tlshd_handshake_parms *parms,
233233}
234234
235235static char tlshd_peername [NI_MAXHOST ] = "unknown" ;
236- static struct sockaddr_storage tlshd_peeraddr = { 0 };
237236
238237static int tlshd_genl_valid_handler (struct nl_msg * msg , void * arg )
239238{
240239 struct nlattr * tb [HANDSHAKE_A_ACCEPT_MAX + 1 ];
241240 struct tlshd_handshake_parms * parms = arg ;
241+ struct sockaddr_storage addr ;
242+ struct sockaddr * sap = NULL ;
243+ socklen_t salen , optlen ;
242244 char * peername = NULL ;
243- socklen_t optlen ;
244245 int err ;
245246
246247 tlshd_log_debug ("Parsing a valid netlink message\n" );
@@ -253,18 +254,32 @@ static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
253254 }
254255
255256 if (tb [HANDSHAKE_A_ACCEPT_SOCKFD ]) {
257+ char buf [NI_MAXHOST ];
258+ int proto ;
259+
256260 parms -> sockfd = nla_get_s32 (tb [HANDSHAKE_A_ACCEPT_SOCKFD ]);
257- if (getpeername (parms -> sockfd , parms -> peeraddr ,
258- & parms -> peeraddr_len ) == -1 ) {
261+
262+ salen = sizeof (addr );
263+ sap = (struct sockaddr * )& addr ;
264+ if (getpeername (parms -> sockfd , sap , & salen ) == -1 ) {
259265 tlshd_log_perror ("getpeername" );
260266 return NL_STOP ;
261267 }
262- optlen = sizeof (parms -> ip_proto );
268+ err = getnameinfo (sap , salen , buf , sizeof (buf ),
269+ NULL , 0 , NI_NUMERICHOST );
270+ if (err ) {
271+ tlshd_log_gai_error (err );
272+ return NL_STOP ;
273+ }
274+ parms -> peeraddr = strdup (buf );
275+
276+ optlen = sizeof (proto );
263277 if (getsockopt (parms -> sockfd , SOL_SOCKET , SO_PROTOCOL ,
264- & parms -> ip_proto , & optlen ) == -1 ) {
278+ & proto , & optlen ) == -1 ) {
265279 tlshd_log_perror ("getsockopt (SO_PROTOCOL)" );
266280 return NL_STOP ;
267281 }
282+ parms -> ip_proto = proto ;
268283 }
269284 if (tb [HANDSHAKE_A_ACCEPT_MESSAGE_TYPE ])
270285 parms -> handshake_type = nla_get_u32 (tb [HANDSHAKE_A_ACCEPT_MESSAGE_TYPE ]);
@@ -290,8 +305,8 @@ static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
290305
291306 if (peername )
292307 strncpy (tlshd_peername , peername , sizeof (tlshd_peername ) - 1 );
293- else {
294- err = getnameinfo (parms -> peeraddr , parms -> peeraddr_len ,
308+ else if ( sap ) {
309+ err = getnameinfo (sap , salen ,
295310 tlshd_peername , sizeof (tlshd_peername ),
296311 NULL , 0 , NI_NAMEREQD );
297312 if (err ) {
@@ -305,8 +320,7 @@ static int tlshd_genl_valid_handler(struct nl_msg *msg, void *arg)
305320
306321static const struct tlshd_handshake_parms tlshd_default_handshake_parms = {
307322 .peername = tlshd_peername ,
308- .peeraddr = (struct sockaddr * )& tlshd_peeraddr ,
309- .peeraddr_len = sizeof (tlshd_peeraddr ),
323+ .peeraddr = NULL ,
310324 .sockfd = -1 ,
311325 .ip_proto = -1 ,
312326 .handshake_type = HANDSHAKE_MSG_TYPE_UNSPEC ,
@@ -412,6 +426,7 @@ void tlshd_genl_put_handshake_parms(struct tlshd_handshake_parms *parms)
412426 keyctl_unlink (parms -> keyring , KEY_SPEC_SESSION_KEYRING );
413427 g_array_free (parms -> peerids , TRUE);
414428 g_array_free (parms -> remote_peerids , TRUE);
429+ free (parms -> peeraddr );
415430}
416431
417432static int tlshd_genl_put_remote_peerids (struct nl_msg * msg ,
0 commit comments