summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2010-12-30 12:24:46 +0000
committerArthur de Jong <arthur@arthurdejong.org>2010-12-30 12:24:46 +0000
commit726a1a89d34fbdb4974cd24a1ecc3369f241de19 (patch)
treee8c866d85c5a7522f8e370d9dbbc8ec5f6594d0b
parentd99781bdf175fd7b66d37741c3acf33ca9331b49 (diff)
implement buffer checking and simplify code somewhat
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd-solaris@1351 ef36b2f9-881f-0410-afb5-c4e39611909c
-rw-r--r--nss/ethers.c30
-rw-r--r--nss/group.c29
2 files changed, 31 insertions, 28 deletions
diff --git a/nss/ethers.c b/nss/ethers.c
index 2f386d6..a109cf3 100644
--- a/nss/ethers.c
+++ b/nss/ethers.c
@@ -100,28 +100,26 @@ nss_status_t _nss_ldap_endetherent(void)
static nss_status_t read_etherstring(TFILE *fp,nss_XbyY_args_t *args)
{
- /* TODO: padl uses struct ether, verify */
struct etherent result;
nss_status_t retv;
char *buffer;
- size_t buflen;
- /* read the etherent */
- retv=read_etherent(fp,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno);
+ int res;
+ /* read the etherent into a temporary buffer */
+ buffer=(char *)malloc(args->buf.buflen);
+ if (buffer==NULL)
+ return NSS_STATUS_UNAVAIL;
+ retv=read_etherent(fp,&result,buffer,args->buf.buflen,&errno);
if (retv!=NSS_STATUS_SUCCESS)
+ {
+ free(buffer);
return retv;
- /* allocate a temporary buffer */
- buflen=args->buf.buflen;
- buffer=(char *)malloc(buflen);
- /* build the formatted string */
- /* FIXME: implement proper buffer size checking */
- /* TODO: OpenSolaris expects "<macAddress> <host>" */
- /* This output is handled correctly by NSCD,but not */
- /* when NSCD is off. Not an issue with NSS_LDAP,but */
- /* with the frontend. */
- sprintf(buffer,"%s %s",ether_ntoa(&result.e_addr),result.e_name);
- /* copy the result back to the result buffer and free the temporary one */
- strcpy(NSS_ARGS(args)->buf.buffer,buffer);
+ }
+ /* make a string representation */
+ res=snprintf(args->buf.buffer,args->buf.buflen,
+ "%s %s",ether_ntoa(&result.e_addr),result.e_name);
free(buffer);
+ if ((res<0)||(res>=args->buf.buflen))
+ return NSS_STATUS_TRYAGAIN;
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
return NSS_STATUS_SUCCESS;
diff --git a/nss/group.c b/nss/group.c
index b460445..c20ac04 100644
--- a/nss/group.c
+++ b/nss/group.c
@@ -192,26 +192,31 @@ static nss_status_t read_groupstring(TFILE *fp,nss_XbyY_args_t *args)
char *buffer;
size_t buflen;
int i;
- /* read the groupent */
- retv=read_group(fp,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno);
+ /* read the group into a temporary buffer */
+ buffer=(char *)malloc(args->buf.buflen);
+ if (buffer==NULL)
+ return NSS_STATUS_UNAVAIL;
+ retv=read_group(fp,&result,buffer,args->buf.buflen,&errno);
if (retv!=NSS_STATUS_SUCCESS)
+ {
+ free(buffer);
return retv;
- /* allocate a temporary buffer */
- buflen=args->buf.buflen;
- buffer=(char *)malloc(buflen);
- /* build the formatted string */
- /* FIXME: implement proper buffer size checking */
- sprintf(buffer,"%s:%s:%d:",result.gr_name,result.gr_passwd,(int)result.gr_gid);
+ }
+ /* make a string representation */
+ snprintf(args->buf.buffer,args->buf.buflen,
+ "%s:%s:%d:",result.gr_name,result.gr_passwd,(int)result.gr_gid);
+ args->buf.buffer[args->buf.buflen-1]='\0';
if (result.gr_mem)
for (i=0;result.gr_mem[i];i++)
{
if (i)
- strcat(buffer,",");
- strcat(buffer,result.gr_mem[i]);
+ strncat(args->buf.buffer,args->buf.buflen-strlen(args->buf.buffer)-1,",");
+ strncat(args->buf.buffer,args->buf.buflen-strlen(args->buf.buffer)-1,result.gr_mem[i]);
}
- /* copy the result back to the result buffer and free the temporary one */
- strcpy(NSS_ARGS(args)->buf.buffer,buffer);
free(buffer);
+ /* check if buffer overflowed */
+ if (strlen(args->buf.buffer)>=args->buf.buffer-1)
+ return NSS_STATUS_TRYAGAIN;
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
return NSS_STATUS_SUCCESS;