diff --git a/diagnose_usb/diagnose_usb.cpp b/diagnose_usb/diagnose_usb.cpp index 35edb5e05..5716323ce 100644 --- a/diagnose_usb/diagnose_usb.cpp +++ b/diagnose_usb/diagnose_usb.cpp @@ -19,7 +19,9 @@ #include #include +#include #include +#include #include @@ -45,9 +47,25 @@ static std::string GetUdevProblem() { return ""; } - // getgroups(2) indicates that the GNU group_member(3) may not check the egid so we check it - // additionally just to be sure. - if (group_member(plugdev_group->gr_gid) || getegid() == plugdev_group->gr_gid) { + int ngroups = getgroups(0, nullptr); + if (ngroups < 0) { + perror("failed to get groups list size"); + return ""; + } + + std::vector groups(ngroups); + ngroups = getgroups(groups.size(), groups.data()); + if (ngroups < 0) { + perror("failed to get groups list"); + return ""; + } + + groups.resize(ngroups); + + // getgroups(2) indicates that the egid may not be included so we check it additionally just + // to be sure. + if (std::find(groups.begin(), groups.end(), plugdev_group->gr_gid) != groups.end() || + getegid() == plugdev_group->gr_gid) { // The user is in plugdev so the problem is likely with the udev rules. return "missing udev rules? user is in the plugdev group"; }