Skip to content

Commit 744d2cb

Browse files
author
Oleg Girko
committed
Return proper errno code when mapping UNIX socket address.
Path mapping now can fail if pathname component doesn't exist, so this condition must be handled correctly when mapping UNIX socket address. Signed-off-by: Oleg Girko <[email protected]>
1 parent 319629a commit 744d2cb

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

scratchbox2/preload/network.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)