diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2012-10-13 21:08:59 +0000 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2012-10-13 21:08:59 +0000 |
commit | b27f3f8fe80cc2dcbf66f975c4d987209d529586 (patch) | |
tree | 650b7c61ff56133b598aa7c50530c4bf951ce98a | |
parent | 43ac16ba109680eb79a737266f7372423c4ffad4 (diff) |
in ether handling only write to output values and return correct error for buffer too small
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1791 ef36b2f9-881f-0410-afb5-c4e39611909c
-rw-r--r-- | HACKING | 4 | ||||
-rw-r--r-- | nss/ethers.c | 13 |
2 files changed, 10 insertions, 7 deletions
@@ -137,7 +137,9 @@ back-end can presumably also be created. Earlier versions of Solaris expected the NSS functions to return the binary representation of the lookups (e.g. struct passwd) but later versions expect a string representation of the data to be returned (just like a single line out -of /etc/passwd was read). +of /etc/passwd was read) but only if running from nscd. If args->buf.result +is NULL a string representation is requested (except for ether by address +lookup which is special). Source and documentation pointers for Solaris NSS: http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/nsswitch/ diff --git a/nss/ethers.c b/nss/ethers.c index 349ddab..a9ae132 100644 --- a/nss/ethers.c +++ b/nss/ethers.c @@ -119,25 +119,26 @@ static nss_status_t read_result(TFILE *fp,void *args,int wantname) res=snprintf(NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen, "%s %s",ether_ntoa(&result.e_addr),result.e_name); if ((res<0)||(res>=NSS_ARGS(args)->buf.buflen)) - return NSS_STR_PARSE_PARSE; + { + NSS_ARGS(args)->erange=1; + return NSS_NOTFOUND; + } NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer; NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->returnval); - NSS_ARGS(args)->buf.result=NULL; return NSS_SUCCESS; } -#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ +#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ /* return the result entry */ if (wantname) { + /* we expect the buffer to have enough room for the name (buflen==0) */ strcpy(NSS_ARGS(args)->buf.buffer,result.e_name); - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result=NSS_ARGS(args)->buf.buffer; - NSS_ARGS(args)->buf.buflen=strlen(NSS_ARGS(args)->returnval); + NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer; } else /* address */ { memcpy(NSS_ARGS(args)->buf.result,&result.e_addr,sizeof(result.e_addr)); NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - NSS_ARGS(args)->buf.result=NULL; } return NSS_SUCCESS; } |