Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nss/passwd.c
diff options
context:
space:
mode:
Diffstat (limited to 'nss/passwd.c')
-rw-r--r--nss/passwd.c58
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;