From d2eb8a023547b03246f16ce455d20a4acfd552c4 Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Thu, 24 Jul 2025 09:59:07 -0500 Subject: [PATCH] bluetooth: sdpd: switch to getpeereid() instead of LOCAL_PEERCRED sdpd's usage was mostly fine, though it debatably should have been checking the xucred version to avoid mishaps. Switch it to getpeereid() anyways to avoid embedding xucred layout details in more program. Reviewed by: emax Differential Revision: https://reviews.freebsd.org/D51152 --- usr.sbin/bluetooth/sdpd/server.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/usr.sbin/bluetooth/sdpd/server.c b/usr.sbin/bluetooth/sdpd/server.c index ab398cd9339..05a4cb5f023 100644 --- a/usr.sbin/bluetooth/sdpd/server.c +++ b/usr.sbin/bluetooth/sdpd/server.c @@ -345,14 +345,12 @@ server_accept_client(server_p srv, int32_t fd) return; } } else { - struct xucred cr; + uid_t uid; + gid_t gid; struct passwd *pw; /* Get peer's credentials */ - memset(&cr, 0, sizeof(cr)); - size = sizeof(cr); - - if (getsockopt(cfd, 0, LOCAL_PEERCRED, &cr, &size) < 0) { + if (getpeereid(cfd, &uid, &gid) < 0) { log_err("Could not get peer's credentials. %s (%d)", strerror(errno), errno); close(cfd); @@ -360,12 +358,12 @@ server_accept_client(server_p srv, int32_t fd) } /* Check credentials */ - pw = getpwuid(cr.cr_uid); + pw = getpwuid(uid); if (pw != NULL) priv = (strcmp(pw->pw_name, "root") == 0); else log_warning("Could not verify credentials for uid %d", - cr.cr_uid); + uid); memcpy(&srv->req_sa.l2cap_bdaddr, NG_HCI_BDADDR_ANY, sizeof(srv->req_sa.l2cap_bdaddr));