mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -05:00
core: check return value of getgrnam_r() instead of errno
According to POSIX getgrnam_r() returns the error code as return value, and not in errno. Honour that. Pointed out and inspired by a patch from Ted Percival.
This commit is contained in:
parent
f4f16ab10d
commit
c5bd72509e
1 changed files with 34 additions and 40 deletions
|
|
@ -975,6 +975,7 @@ static int is_group(gid_t gid, const char *name) {
|
||||||
int r = -1;
|
int r = -1;
|
||||||
|
|
||||||
#ifdef HAVE_GETGRGID_R
|
#ifdef HAVE_GETGRGID_R
|
||||||
|
|
||||||
#ifdef _SC_GETGR_R_SIZE_MAX
|
#ifdef _SC_GETGR_R_SIZE_MAX
|
||||||
n = sysconf(_SC_GETGR_R_SIZE_MAX);
|
n = sysconf(_SC_GETGR_R_SIZE_MAX);
|
||||||
#else
|
#else
|
||||||
|
|
@ -985,38 +986,25 @@ static int is_group(gid_t gid, const char *name) {
|
||||||
|
|
||||||
data = pa_xmalloc((size_t) n);
|
data = pa_xmalloc((size_t) n);
|
||||||
|
|
||||||
|
if ((errno = getgrgid_r(gid, &group, data, (size_t) n, &result)) || !result)
|
||||||
|
#else
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (getgrgid_r(gid, &group, data, (size_t) n, &result) < 0 || !result) {
|
if (!(result = getgrgid(gid)))
|
||||||
pa_log("getgrgid_r(%u): %s", (unsigned) gid, pa_cstrerror(errno));
|
#endif
|
||||||
|
{
|
||||||
if (!errno)
|
if (!errno)
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = strcmp(name, result->gr_name) == 0;
|
|
||||||
|
|
||||||
finish:
|
|
||||||
pa_xfree(data);
|
|
||||||
#else
|
|
||||||
/* XXX Not thread-safe, but needed on OSes (e.g. FreeBSD 4.X) that do not
|
|
||||||
* support getgrgid_r. */
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
if (!(result = getgrgid(gid))) {
|
|
||||||
pa_log("getgrgid(%u): %s", gid, pa_cstrerror(errno));
|
pa_log("getgrgid(%u): %s", gid, pa_cstrerror(errno));
|
||||||
|
|
||||||
if (!errno)
|
|
||||||
errno = ENOENT;
|
|
||||||
|
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = strcmp(name, result->gr_name) == 0;
|
r = strcmp(name, result->gr_name) == 0;
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
#endif
|
|
||||||
|
pa_xfree(data);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -1065,12 +1053,14 @@ finish:
|
||||||
|
|
||||||
/* Check whether the specifc user id is a member of the specified group */
|
/* Check whether the specifc user id is a member of the specified group */
|
||||||
int pa_uid_in_group(uid_t uid, const char *name) {
|
int pa_uid_in_group(uid_t uid, const char *name) {
|
||||||
char *g_buf, *p_buf;
|
char *g_buf = NULL, *p_buf = NULL;
|
||||||
long g_n, p_n;
|
long g_n, p_n;
|
||||||
struct group grbuf, *gr;
|
struct group grbuf, *gr = NULL;
|
||||||
char **i;
|
char **i;
|
||||||
int r = -1;
|
int r = -1;
|
||||||
|
|
||||||
|
#ifdef HAVE_GETGRNAM_R
|
||||||
|
|
||||||
#ifdef _SC_GETGR_R_SIZE_MAX
|
#ifdef _SC_GETGR_R_SIZE_MAX
|
||||||
g_n = sysconf(_SC_GETGR_R_SIZE_MAX);
|
g_n = sysconf(_SC_GETGR_R_SIZE_MAX);
|
||||||
#else
|
#else
|
||||||
|
|
@ -1081,6 +1071,19 @@ int pa_uid_in_group(uid_t uid, const char *name) {
|
||||||
|
|
||||||
g_buf = pa_xmalloc((size_t) g_n);
|
g_buf = pa_xmalloc((size_t) g_n);
|
||||||
|
|
||||||
|
if ((errno = getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr)) != 0 || !gr)
|
||||||
|
#else
|
||||||
|
errno = 0;
|
||||||
|
if (!(gr = getgrnam(name)))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (!errno)
|
||||||
|
errno = ENOENT;
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_GETPWNAM_R
|
||||||
|
|
||||||
#ifdef _SC_GETPW_R_SIZE_MAX
|
#ifdef _SC_GETPW_R_SIZE_MAX
|
||||||
p_n = sysconf(_SC_GETPW_R_SIZE_MAX);
|
p_n = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||||
#else
|
#else
|
||||||
|
|
@ -1090,26 +1093,16 @@ int pa_uid_in_group(uid_t uid, const char *name) {
|
||||||
p_n = 512;
|
p_n = 512;
|
||||||
|
|
||||||
p_buf = pa_xmalloc((size_t) p_n);
|
p_buf = pa_xmalloc((size_t) p_n);
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
#ifdef HAVE_GETGRNAM_R
|
|
||||||
if (getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr) != 0 || !gr)
|
|
||||||
#else
|
|
||||||
if (!(gr = getgrnam(name)))
|
|
||||||
#endif
|
#endif
|
||||||
{
|
|
||||||
if (!errno)
|
|
||||||
errno = ENOENT;
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = 0;
|
r = 0;
|
||||||
for (i = gr->gr_mem; *i; i++) {
|
for (i = gr->gr_mem; *i; i++) {
|
||||||
struct passwd pwbuf, *pw;
|
struct passwd pwbuf, *pw = NULL;
|
||||||
|
|
||||||
#ifdef HAVE_GETPWNAM_R
|
#ifdef HAVE_GETPWNAM_R
|
||||||
if (getpwnam_r(*i, &pwbuf, p_buf, (size_t) p_n, &pw) != 0 || !pw)
|
if ((errno = getpwnam_r(*i, &pwbuf, p_buf, (size_t) p_n, &pw)) != 0 || !pw)
|
||||||
#else
|
#else
|
||||||
|
errno = 0;
|
||||||
if (!(pw = getpwnam(*i)))
|
if (!(pw = getpwnam(*i)))
|
||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -1130,9 +1123,11 @@ finish:
|
||||||
/* Get the GID of a gfiven group, return (gid_t) -1 on failure. */
|
/* Get the GID of a gfiven group, return (gid_t) -1 on failure. */
|
||||||
gid_t pa_get_gid_of_group(const char *name) {
|
gid_t pa_get_gid_of_group(const char *name) {
|
||||||
gid_t ret = (gid_t) -1;
|
gid_t ret = (gid_t) -1;
|
||||||
char *g_buf;
|
char *g_buf = NULL;
|
||||||
long g_n;
|
long g_n;
|
||||||
struct group grbuf, *gr;
|
struct group grbuf, *gr = NULL;
|
||||||
|
|
||||||
|
#ifdef HAVE_GETGRNAM_R
|
||||||
|
|
||||||
#ifdef _SC_GETGR_R_SIZE_MAX
|
#ifdef _SC_GETGR_R_SIZE_MAX
|
||||||
g_n = sysconf(_SC_GETGR_R_SIZE_MAX);
|
g_n = sysconf(_SC_GETGR_R_SIZE_MAX);
|
||||||
|
|
@ -1144,10 +1139,9 @@ gid_t pa_get_gid_of_group(const char *name) {
|
||||||
|
|
||||||
g_buf = pa_xmalloc((size_t) g_n);
|
g_buf = pa_xmalloc((size_t) g_n);
|
||||||
|
|
||||||
errno = 0;
|
if ((errno = getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr)) != 0 || !gr)
|
||||||
#ifdef HAVE_GETGRNAM_R
|
|
||||||
if (getgrnam_r(name, &grbuf, g_buf, (size_t) g_n, &gr) != 0 || !gr)
|
|
||||||
#else
|
#else
|
||||||
|
errno = 0;
|
||||||
if (!(gr = getgrnam(name)))
|
if (!(gr = getgrnam(name)))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue