@@ -52,12 +52,13 @@ typedef struct {
5252 char mapped_printable_dst_addr [200 ];
5353} mapped_sockaddr_t ;
5454
55- static void map_sockaddr_un (
55+ static int map_sockaddr_un (
5656 const char * realfnname ,
5757 const struct sockaddr_un * orig_serv_addr_un ,
5858 mapped_sockaddr_t * output_addr )
5959{
6060 mapping_results_t res ;
61+ int result = 0 ;
6162
6263 if (!* orig_serv_addr_un -> sun_path ) {
6364 /* an "abstract" local domain socket.
@@ -71,7 +72,7 @@ static void map_sockaddr_un(
7172 snprintf (output_addr -> mapped_printable_dst_addr ,
7273 sizeof (output_addr -> mapped_printable_dst_addr ),
7374 "<abstract AF_UNIX address>" );
74- return ;
75+ return ( 0 ) ;
7576 }
7677
7778 SB_LOG (SB_LOGLEVEL_DEBUG , "%s: checking AF_UNIX addr '%s'" ,
@@ -85,7 +86,13 @@ static void map_sockaddr_un(
8586 /* FIXME: implement if(pathname_is_readonly!=0)... */
8687 sbox_map_path (realfnname , orig_serv_addr_un -> sun_path ,
8788 0 /*flags*/ , & res , SB2_INTERFACE_CLASS_SOCKADDR );
88- if (res .mres_result_path == NULL ) {
89+ if (res .mres_errno != 0 ) {
90+ result = res .mres_errno ;
91+ SB_LOG (SB_LOGLEVEL_DEBUG ,
92+ "%s: Failed to map AF_UNIX address '%s': errno=%d" ,
93+ realfnname , orig_serv_addr_un -> sun_path , result );
94+ } else if (res .mres_result_path == NULL ) {
95+ result = EINVAL ;
8996 SB_LOG (SB_LOGLEVEL_ERROR ,
9097 "%s: Failed to map AF_UNIX address '%s'" ,
9198 realfnname , orig_serv_addr_un -> sun_path );
@@ -96,6 +103,7 @@ static void map_sockaddr_un(
96103 output_addr -> mapped_sockaddr_un = * orig_serv_addr_un ;
97104 if (sizeof (output_addr -> mapped_sockaddr_un .sun_path ) <=
98105 strlen (res .mres_result_path )) {
106+ result = ENAMETOOLONG ;
99107 SB_LOG (SB_LOGLEVEL_ERROR ,
100108 "%s: Mapped AF_UNIX address (%s) is too long" ,
101109 realfnname , res .mres_result_path );
@@ -114,6 +122,7 @@ static void map_sockaddr_un(
114122 }
115123 }
116124 free_mapping_results (& res );
125+ return (result );
117126}
118127
119128/* returns 0 if success, errno code if failed */
@@ -358,9 +367,18 @@ static int map_sockaddr(
358367 case AF_UNIX :
359368 output_addr -> mapped_addrlen = input_addrlen ;
360369
361- map_sockaddr_un (realfnname ,
370+ inet_mapping_result = map_sockaddr_un (realfnname ,
362371 (const struct sockaddr_un * )input_addr ,
363372 output_addr );
373+ if (inet_mapping_result != 0 ) {
374+ /* return error */
375+ * result_errno_ptr = inet_mapping_result ;
376+ SB_LOG (SB_LOGLEVEL_NETWORK ,
377+ "%s: denied (%s), errno=%d" ,
378+ realfnname , output_addr -> orig_printable_dst_addr ,
379+ inet_mapping_result );
380+ return (MAP_SOCKADDR_OPERATION_DENIED );
381+ }
364382 SB_LOG (SB_LOGLEVEL_DEBUG , "%s: orig addr.len=%d, mapped_addrlen=%d" ,
365383 __func__ , input_addrlen , output_addr -> mapped_addrlen );
366384 return (MAP_SOCKADDR_MAPPED );
0 commit comments