summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Reichl <preichl@redhat.com>2015-10-15 23:46:58 +0200
committerJakub Hrozek <jhrozek@redhat.com>2015-10-16 16:08:12 +0200
commit5e9cbb54fadf81193249d5449a9e015d112e4bd3 (patch)
tree7683a384d4c178d324abc292b9f210a49a8035ce
parentf47163162cb50d00cbad1aa7ebf9a1cf8464b826 (diff)
downloadsssd-5e9cbb54fadf81193249d5449a9e015d112e4bd3.tar.gz
sssd-5e9cbb54fadf81193249d5449a9e015d112e4bd3.tar.xz
sssd-5e9cbb54fadf81193249d5449a9e015d112e4bd3.zip
PAM: refac. pam_reply: extract func. produce_packet
-rw-r--r--src/responder/pam/pamsrv_cmd.c120
1 files changed, 69 insertions, 51 deletions
diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c
index 942a966a6..85b356617 100644
--- a/src/responder/pam/pamsrv_cmd.c
+++ b/src/responder/pam/pamsrv_cmd.c
@@ -290,6 +290,73 @@ done:
return ret;
}
+static errno_t produce_packet(TALLOC_CTX *mem_ctx,
+ struct pam_data *pd,
+ enum sss_cli_command cmd,
+ struct sss_packet **_out)
+{
+ errno_t ret;
+ uint8_t *body;
+ size_t blen;
+ int32_t resp_c;
+ int32_t resp_size;
+ struct response_data *resp;
+ int p;
+ struct sss_packet *out;
+
+ ret = sss_packet_new(mem_ctx, 0, cmd, &out);
+ if (ret != EOK) {
+ goto done;
+ }
+
+ resp_c = 0;
+ resp_size = 0;
+ resp = pd->resp_list;
+ while(resp != NULL) {
+ if (!resp->do_not_send_to_client) {
+ resp_c++;
+ resp_size += resp->len;
+ }
+ resp = resp->next;
+ }
+
+ ret = sss_packet_grow(out, sizeof(int32_t) + sizeof(int32_t) +
+ resp_c * 2 * sizeof(int32_t) + resp_size);
+ if (ret != EOK) {
+ goto done;
+ }
+
+ sss_packet_get_body(out, &body, &blen);
+ DEBUG(SSSDBG_FUNC_DATA, "blen: %zu\n", blen);
+ p = 0;
+
+ memcpy(&body[p], &pd->pam_status, sizeof(int32_t));
+ p += sizeof(int32_t);
+
+ memcpy(&body[p], &resp_c, sizeof(int32_t));
+ p += sizeof(int32_t);
+
+ resp = pd->resp_list;
+ while(resp != NULL) {
+ if (!resp->do_not_send_to_client) {
+ memcpy(&body[p], &resp->type, sizeof(int32_t));
+ p += sizeof(int32_t);
+ memcpy(&body[p], &resp->len, sizeof(int32_t));
+ p += sizeof(int32_t);
+ memcpy(&body[p], resp->data, resp->len);
+ p += resp->len;
+ }
+
+ resp = resp->next;
+ }
+
+ *_out = out;
+ ret = EOK;
+
+done:
+ return ret;
+}
+
static int pam_forwarder(struct cli_ctx *cctx, int pam_cmd);
static void pam_handle_cached_login(struct pam_auth_req *preq, int ret,
time_t expire_date, time_t delayed_until, bool cached_auth);
@@ -297,13 +364,7 @@ static void pam_handle_cached_login(struct pam_auth_req *preq, int ret,
static void pam_reply(struct pam_auth_req *preq)
{
struct cli_ctx *cctx;
- uint8_t *body;
- size_t blen;
int ret;
- int32_t resp_c;
- int32_t resp_size;
- struct response_data *resp;
- int p;
struct timeval tv;
struct tevent_timer *te;
struct pam_data *pd;
@@ -445,12 +506,6 @@ static void pam_reply(struct pam_auth_req *preq)
goto done;
}
- ret = sss_packet_new(cctx->creq, 0, sss_packet_get_cmd(cctx->creq->in),
- &cctx->creq->out);
- if (ret != EOK) {
- goto done;
- }
-
ret = filter_responses(pctx->rctx->cdb, pd->resp_list);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "filter_responses failed, not fatal.\n");
@@ -465,49 +520,12 @@ static void pam_reply(struct pam_auth_req *preq)
}
}
- resp_c = 0;
- resp_size = 0;
- resp = pd->resp_list;
- while(resp != NULL) {
- if (!resp->do_not_send_to_client) {
- resp_c++;
- resp_size += resp->len;
- }
- resp = resp->next;
- }
-
- ret = sss_packet_grow(cctx->creq->out, sizeof(int32_t) +
- sizeof(int32_t) +
- resp_c * 2* sizeof(int32_t) +
- resp_size);
+ ret = produce_packet(cctx->creq, pd, sss_packet_get_cmd(cctx->creq->in),
+ &cctx->creq->out);
if (ret != EOK) {
goto done;
}
- sss_packet_get_body(cctx->creq->out, &body, &blen);
- DEBUG(SSSDBG_FUNC_DATA, "blen: %zu\n", blen);
- p = 0;
-
- memcpy(&body[p], &pd->pam_status, sizeof(int32_t));
- p += sizeof(int32_t);
-
- memcpy(&body[p], &resp_c, sizeof(int32_t));
- p += sizeof(int32_t);
-
- resp = pd->resp_list;
- while(resp != NULL) {
- if (!resp->do_not_send_to_client) {
- memcpy(&body[p], &resp->type, sizeof(int32_t));
- p += sizeof(int32_t);
- memcpy(&body[p], &resp->len, sizeof(int32_t));
- p += sizeof(int32_t);
- memcpy(&body[p], resp->data, resp->len);
- p += resp->len;
- }
-
- resp = resp->next;
- }
-
done:
sss_cmd_done(cctx, preq);
}