*/
struct kp_arg {
char **pp, *pstore;
+ size_t allocated;
};
krb5_error_code
klog_prompter(krb5_context context,
krb5_prompt_type *types;
#endif
struct kp_arg *kparg = (struct kp_arg *) a;
+ size_t length;
+
code = krb5_prompter_posix(context, a, name, banner, num_prompts, prompts);
if (code) return code;
#if !defined(USING_HEIMDAL) && defined(HAVE_KRB5_GET_PROMPT_TYPES)
switch(type) {
case KRB5_PROMPT_TYPE_PASSWORD:
case KRB5_PROMPT_TYPE_NEW_PASSWORD_AGAIN:
- memcpy(kparg->pstore, prompts[i].reply->data, prompts[i].reply->length);
- kparg->pstore[prompts[i].reply->length] = 0;
+ length = prompts[i].reply->length;
+ if (length > kparg->allocated - 1)
+ length = kparg->allocated - 1;
+ memcpy(kparg->pstore, prompts[i].reply->data, length);
+ kparg->pstore[length] = 0;
*kparg->pp = kparg->pstore;
}
}
klog_arg->pp = &pass;
klog_arg->pstore = passwd;
+ klog_arg->allocated = sizeof(passwd);
/* XXX should allow k5 to prompt in most cases -- what about expired pw?*/
krb5_get_init_creds_opt_init(gic_opts);
for (;;) {