diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2009-09-29 07:34:30 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2009-10-13 11:13:43 -0400 |
commit | fb7a7c1ea8f251efd741096edd027c232838de2b (patch) | |
tree | 4a89e861e44720fada038f9882e98089a5fd0c31 /server/responder/nss/nsssrv_cmd.c | |
parent | a17492664e4580ecdd3decedc9280ab4d1ce32e9 (diff) | |
download | sssd_unused-fb7a7c1ea8f251efd741096edd027c232838de2b.tar.gz sssd_unused-fb7a7c1ea8f251efd741096edd027c232838de2b.tar.xz sssd_unused-fb7a7c1ea8f251efd741096edd027c232838de2b.zip |
Fix infinite loop with empty group enumeration
Loop control variable was not being incremented.
I also converted a goto loop into a do...while loop to make it
easier to follow the logic.
Diffstat (limited to 'server/responder/nss/nsssrv_cmd.c')
-rw-r--r-- | server/responder/nss/nsssrv_cmd.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/server/responder/nss/nsssrv_cmd.c b/server/responder/nss/nsssrv_cmd.c index 8ca0be68..ebfd1d56 100644 --- a/server/responder/nss/nsssrv_cmd.c +++ b/server/responder/nss/nsssrv_cmd.c @@ -2645,26 +2645,28 @@ static int nss_cmd_retgrent(struct cli_ctx *cctx, int num) nctx = talloc_get_type(cctx->rctx->pvt_ctx, struct nss_ctx); gctx = nctx->gctx; -retry: - if (gctx->cur >= gctx->num) goto none; - - gdom = &gctx->doms[gctx->cur]; + do { + if (gctx->cur >= gctx->num) goto none; - n = gdom->res->count - gdom->cur; - if (n == 0 && (gctx->cur+1 < gctx->num)) { - gctx->cur++; gdom = &gctx->doms[gctx->cur]; + n = gdom->res->count - gdom->cur; - } + if (n == 0 && (gctx->cur+1 < gctx->num)) { + gctx->cur++; + gdom = &gctx->doms[gctx->cur]; + n = gdom->res->count - gdom->cur; + } - if (!n) goto none; + if (!n) goto none; - msgs = &(gdom->res->msgs[gdom->cur]); + msgs = &(gdom->res->msgs[gdom->cur]); - ret = fill_grent(cctx->creq->out, gdom->domain, nctx, true, msgs, num, &n); - if (ret == ENOENT) goto retry; + ret = fill_grent(cctx->creq->out, gdom->domain, nctx, true, msgs, num, &n); + + gdom->cur += n; + + } while(ret == ENOENT); - gdom->cur += n; return ret; none: |