diff options
Diffstat (limited to 'nss/passwd.c')
-rw-r--r-- | nss/passwd.c | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/nss/passwd.c b/nss/passwd.c index e2e11c2..113c92d 100644 --- a/nss/passwd.c +++ b/nss/passwd.c @@ -99,42 +99,50 @@ nss_status_t _nss_ldap_endpwent(void) #ifdef NSS_FLAVOUR_SOLARIS #ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN -static nss_status_t read_passwdstring(TFILE *fp,nss_XbyY_args_t *args) +static char *passwd2str(struct passwd *result,char *buffer,size_t buflen) { - struct passwd result; - char buffer[NSS_BUFLEN_PASSWD]; - nss_status_t retv; int res; - /* read the passwd */ - retv=read_passwd(fp,&result,buffer,sizeof(buffer),&NSS_ARGS(args)->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - /* build the formatted string */ - res=snprintf(args->buf.buffer,args->buf.buflen,"%s:%s:%d:%d:%s:%s:%s", - result.pw_name,result.pw_passwd,(int)result.pw_uid,(int)result.pw_gid,result.pw_gecos, - result.pw_dir,result.pw_shell); - if ((res<0)||(res>=NSS_ARGS(args)->buf.buflen)) - { - NSS_ARGS(args)->erange=1; - return NSS_NOTFOUND; - } - /* return the string as a result */ - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; + res=snprintf(buffer,buflen,"%s:%s:%d:%d:%s:%s:%s", + result->pw_name,result->pw_passwd,(int)result->pw_uid,(int)result->pw_gid, + result->pw_gecos,result->pw_dir,result->pw_shell); + if ((res<0)||(res>=buflen)) + return NULL; + return buffer; } -#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ +#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { nss_status_t retv; #ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN + struct passwd result; + char *buffer; /* try to return in string format if requested */ if (args->buf.result==NULL) - return read_passwdstring(fp,args); -#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ + { + /* read the entry into a temporary buffer */ + buffer=(char *)malloc(args->buf.buflen); + if (buffer==NULL) + return NSS_STATUS_UNAVAIL; + retv=read_passwd(fp,&result,buffer,args->buf.buflen,&args->erange); + /* format to string */ + if (retv==NSS_STATUS_SUCCESS) + if (passwd2str(&result,args->buf.buffer,args->buf.buflen)==NULL) + { + args->erange=1; + retv=NSS_NOTFOUND; + } + /* clean up and return result */ + free(buffer); + if (retv!=NSS_STATUS_SUCCESS) + return retv; + args->returnval=args->buf.buffer; + args->returnlen=strlen(args->returnval); + return NSS_STATUS_SUCCESS; + } +#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ /* read the entry */ - retv=read_passwd(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&NSS_ARGS(args)->erange); + retv=read_passwd(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); if (retv!=NSS_STATUS_SUCCESS) return retv; args->returnval=args->buf.result; |