mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -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