Skip to content
Snippets Groups Projects
Select Git revision
  • e61be41d864e693dc77338bbdc502ae3badbd908
  • master default protected
2 results

10-DU-nss_name-local_realms.patch

Blame
  • 10-DU-nss_name-local_realms.patch 1.88 KiB
    Description: nss_name_to_uid/gud() search also Local-Realms
    
    --- a/nss.c
    +++ b/nss.c
    @@ -203,32 +203,44 @@
     	return NULL;
     }
     
    -static int nss_name_to_uid(char *name, uid_t *uid)
    +static int nss_name_domain_to_uid(char *name, char *domain, uid_t *uid)
     {
     	struct passwd *pw = NULL;
    -	char *domain;
     	int err = -ENOENT;
    -
    -	domain = get_default_domain();
     	pw = nss_getpwnam(name, domain, &err);
    -	if (pw == NULL)
    -		goto out;
    +	if (pw == NULL) return err;
     	*uid = pw->pw_uid;
     	free(pw);
    -	err = 0;
    -out:
    +	return 0;
    +}
    +
    +static int nss_name_to_uid(char *name, uid_t *uid)
    +{
    +	struct conf_list *realms;
    +	struct conf_list_node *r;
    +	char *domain;
    +	int err;
    +
    +	domain = get_default_domain();
    +	err = nss_name_domain_to_uid(name, domain, uid);
    +	if (!err) return err;
    +
    +	realms = get_local_realms();
    +	TAILQ_FOREACH(r, &realms->fields, link) {
    +		if (!nss_name_domain_to_uid(name, r->field, uid)) return 0;
    +	}
    +
     	return err;
     }
     
    -static int nss_name_to_gid(char *name, gid_t *gid)
    +static int nss_name_domain_to_gid(char *name, char *domain, gid_t *gid)
     {
     	struct group *gr = NULL;
     	struct group grbuf;
    -	char *buf, *localname, *domain;
    +	char *buf, *localname;
     	size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
     	int err = -EINVAL;
     
    -	domain = get_default_domain();
     	localname = strip_domain(name, domain);
     	if (!localname)
     		goto out;
    @@ -258,6 +270,25 @@
     	return err;
     }
     
    +static int nss_name_to_gid(char *name, gid_t *gid)
    +{
    +	char *domain;
    +	int err;
    +	struct conf_list *realms;
    +	struct conf_list_node *r;
    +
    +	domain = get_default_domain();
    +	err = nss_name_domain_to_gid(name, domain, gid);
    +	if (!err) return 0;
    +
    +	realms = get_local_realms();
    +	TAILQ_FOREACH(r, &realms->fields, link) {
    +		if (!nss_name_domain_to_gid(name, r->field, gid)) return 0;
    +	}
    +	
    +	return err;
    +}
    +
     static int nss_gss_princ_to_ids(char *secname, char *princ,
     				uid_t *uid, uid_t *gid,
     				extra_mapping_params **ex)