summaryrefslogtreecommitdiffstats
path: root/src/sss_client/nss_passwd.c
diff options
context:
space:
mode:
authorStephen Gallagher <sgallagh@redhat.com>2012-01-06 16:47:50 -0500
committerStephen Gallagher <sgallagh@redhat.com>2012-01-18 09:27:56 -0500
commitfd3714d0cf068f3c782c1fff32105fc51cc97a0e (patch)
tree4763af29c0a5e3fa2dd293744dccb1f268e7fca9 /src/sss_client/nss_passwd.c
parent4e19af30cbaf819bdd88f7d0390aeabeb2797a60 (diff)
downloadsssd-fd3714d0cf068f3c782c1fff32105fc51cc97a0e.tar.gz
sssd-fd3714d0cf068f3c782c1fff32105fc51cc97a0e.tar.xz
sssd-fd3714d0cf068f3c782c1fff32105fc51cc97a0e.zip
NSS: Add sss_readrep_copy_string
There were many places in the client code where we were duplicating a loop to copy data in from the response buffer. This patch turns those loops into a function for easier maintenance and easier-to-read *readrep() routines.
Diffstat (limited to 'src/sss_client/nss_passwd.c')
-rw-r--r--src/sss_client/nss_passwd.c99
1 files changed, 29 insertions, 70 deletions
diff --git a/src/sss_client/nss_passwd.c b/src/sss_client/nss_passwd.c
index 15de59728..16124948e 100644
--- a/src/sss_client/nss_passwd.c
+++ b/src/sss_client/nss_passwd.c
@@ -72,6 +72,7 @@ struct sss_nss_pw_rep {
static int sss_nss_getpw_readrep(struct sss_nss_pw_rep *pr,
uint8_t *buf, size_t *len)
{
+ errno_t ret;
size_t i, slen, dlen;
char *sbuf;
uint32_t c;
@@ -91,84 +92,42 @@ static int sss_nss_getpw_readrep(struct sss_nss_pw_rep *pr,
i = 0;
pr->result->pw_name = &(pr->buffer[i]);
- while (slen > i && dlen > 0) {
- pr->buffer[i] = sbuf[i];
- if (pr->buffer[i] == '\0') break;
- i++;
- dlen--;
- }
- if (slen <= i) { /* premature end of buf */
- return EBADMSG;
- }
- if (dlen <= 0) { /* not enough memory */
- return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
- }
- i++;
- dlen--;
+
+ ret = sss_readrep_copy_string(sbuf, &i,
+ &slen, &dlen,
+ &pr->result->pw_name,
+ NULL);
+ if (ret != EOK) return ret;
pr->result->pw_passwd = &(pr->buffer[i]);
- while (slen > i && dlen > 0) {
- pr->buffer[i] = sbuf[i];
- if (pr->buffer[i] == '\0') break;
- i++;
- dlen--;
- }
- if (slen <= i) { /* premature end of buf */
- return EBADMSG;
- }
- if (dlen <= 0) { /* not enough memory */
- return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
- }
- i++;
- dlen--;
+ ret = sss_readrep_copy_string(sbuf, &i,
+ &slen, &dlen,
+ &pr->result->pw_passwd,
+ NULL);
+ if (ret != EOK) return ret;
pr->result->pw_gecos = &(pr->buffer[i]);
- while (slen > i && dlen > 0) {
- pr->buffer[i] = sbuf[i];
- if (pr->buffer[i] == '\0') break;
- i++;
- dlen--;
- }
- if (slen <= i) { /* premature end of buf */
- return EBADMSG;
- }
- if (dlen <= 0) { /* not enough memory */
- return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
- }
- i++;
- dlen--;
+ ret = sss_readrep_copy_string(sbuf, &i,
+ &slen, &dlen,
+ &pr->result->pw_gecos,
+ NULL);
+ if (ret != EOK) return ret;
+
pr->result->pw_dir = &(pr->buffer[i]);
- while (slen > i && dlen > 0) {
- pr->buffer[i] = sbuf[i];
- if (pr->buffer[i] == '\0') break;
- i++;
- dlen--;
- }
- if (slen <= i) { /* premature end of buf */
- return EBADMSG;
- }
- if (dlen <= 0) { /* not enough memory */
- return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
- }
- i++;
- dlen--;
+ ret = sss_readrep_copy_string(sbuf, &i,
+ &slen, &dlen,
+ &pr->result->pw_dir,
+ NULL);
+ if (ret != EOK) return ret;
pr->result->pw_shell = &(pr->buffer[i]);
- while (slen > i && dlen > 0) {
- pr->buffer[i] = sbuf[i];
- if (pr->buffer[i] == '\0') break;
- i++;
- dlen--;
- }
- if (slen <= i) { /* premature end of buf */
- return EBADMSG;
- }
- if (dlen <= 0) { /* not enough memory */
- return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */
- }
-
- *len = slen -i -1;
+ ret = sss_readrep_copy_string(sbuf, &i,
+ &slen, &dlen,
+ &pr->result->pw_shell,
+ NULL);
+ if (ret != EOK) return ret;
+ *len = slen - i;
return 0;
}