Skip to content

Commit 5ff82b7

Browse files
Add a helper function to set capabilities
Signed-off-by: James Lee <james@codeconstruct.com.au>
1 parent 724c550 commit 5ff82b7

1 file changed

Lines changed: 45 additions & 52 deletions

File tree

src/mctpd.c

Lines changed: 45 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,13 +1444,12 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net)
14441444
{
14451445
struct sockaddr_mctp addr = { 0 };
14461446
int rc, sd = -1, val;
1447-
char *failed;
1448-
cap_t cap;
14491447

14501448
sd = mctp_ops.mctp.socket();
14511449
if (sd < 0) {
1452-
failed = "socket()";
1453-
goto warn_out;
1450+
rc = -errno;
1451+
warn("%s: socket() failed", __func__);
1452+
goto out;
14541453
}
14551454

14561455
addr.smctp_family = AF_MCTP;
@@ -1461,26 +1460,9 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net)
14611460

14621461
rc = mctp_ops.mctp.bind(sd, (struct sockaddr *)&addr, sizeof(addr));
14631462
if (rc < 0) {
1464-
failed = "bind()";
1465-
goto warn_out;
1466-
}
1467-
1468-
cap = cap_from_text("CAP_NET_ADMIN=pe");
1469-
if (!cap) {
1470-
failed = "cap_from_text()";
1471-
goto warn_out;
1472-
}
1473-
1474-
rc = cap_set_proc(cap);
1475-
if (rc < 0) {
1476-
failed = "cap_set_proc()";
1477-
goto cap_out;
1478-
}
1479-
1480-
cap_free(cap);
1481-
if (rc < 0) {
1482-
failed = "cap_free()";
1483-
goto warn_out;
1463+
rc = -errno;
1464+
warn("%s: bind() failed", __func__);
1465+
goto out;
14841466
}
14851467

14861468
val = 1;
@@ -1496,15 +1478,6 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net)
14961478
cb_listen_control_msg, ctx);
14971479
return rc;
14981480

1499-
cap_out:
1500-
rc = -errno;
1501-
warn("%s: %s failed", __func__, failed);
1502-
cap_free(cap);
1503-
goto out;
1504-
1505-
warn_out:
1506-
rc = -errno;
1507-
warn("%s: %s failed", __func__, failed);
15081481
out:
15091482
if (rc < 0) {
15101483
close(sd);
@@ -6371,10 +6344,38 @@ static int endpoint_allocate_eids(struct peer *peer)
63716344
return 0;
63726345
}
63736346

6347+
int set_cap(char *str)
6348+
{
6349+
cap_t cap = cap_from_text(str);
6350+
int rc;
6351+
6352+
if (!cap) {
6353+
rc = -errno;
6354+
warnx("Failed allocating capability state: %s, %s %d", str,
6355+
strerror(-rc), rc);
6356+
return rc;
6357+
}
6358+
6359+
rc = cap_set_proc(cap);
6360+
if (rc < 0) {
6361+
rc = -errno;
6362+
warnx("Could not set capabilites: %s, %s %d", str,
6363+
strerror(-rc), rc);
6364+
return rc;
6365+
}
6366+
6367+
rc = cap_free(cap);
6368+
if (rc < 0) {
6369+
rc = -errno;
6370+
warnx("Failed freeing capability state");
6371+
return errno;
6372+
}
6373+
return 0;
6374+
}
6375+
63746376
int main(int argc, char **argv)
63756377
{
63766378
struct ctx ctxi = { 0 }, *ctx = &ctxi;
6377-
cap_t cap;
63786379
int rc;
63796380

63806381
setlinebuf(stdout);
@@ -6394,25 +6395,9 @@ int main(int argc, char **argv)
63946395
err(EXIT_FAILURE, "Can't read configuration");
63956396
}
63966397

6397-
cap = cap_from_text("CAP_NET_BIND_SERVICE=pe CAP_NET_ADMIN=p");
6398-
if (!cap) {
6399-
warnx("Failed allocating capability state, %s %d",
6400-
strerror(errno), -errno);
6401-
return 1;
6402-
}
6403-
6404-
rc = cap_set_proc(cap);
6405-
if (rc < 0) {
6406-
warnx("Could not set capabilites %s %d", strerror(errno),
6407-
-errno);
6408-
return 1;
6409-
}
6410-
6411-
rc = cap_free(cap);
6412-
if (rc < 0) {
6413-
warnx("Failed freeing capability state");
6398+
rc = set_cap("CAP_NET_BIND_SERVICE=p CAP_NET_ADMIN=p");
6399+
if (rc < 0)
64146400
return 1;
6415-
}
64166401

64176402
ctx->nl = mctp_nl_new(false);
64186403
if (!ctx->nl) {
@@ -6440,13 +6425,21 @@ int main(int argc, char **argv)
64406425
if (rc < 0)
64416426
return 1;
64426427

6428+
rc = set_cap("CAP_NET_BIND_SERVICE=pe CAP_NET_ADMIN=p");
6429+
if (rc < 0)
6430+
return 1;
6431+
64436432
// TODO add net argument?
64446433
rc = listen_control_msg(ctx, MCTP_NET_ANY);
64456434
if (rc < 0) {
64466435
warnx("Error in listen, returned %s %d", strerror(-rc), rc);
64476436
return 1;
64486437
}
64496438

6439+
rc = set_cap("CAP_NET_ADMIN=pe");
6440+
if (rc < 0)
6441+
return 1;
6442+
64506443
// All setup must be complete by here, we might immediately
64516444
// get requests from waiting clients.
64526445
rc = request_dbus(ctx);

0 commit comments

Comments
 (0)