summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_prot.c
diff options
context:
space:
mode:
authordavidn <davidn@FreeBSD.org>1997-02-10 06:18:20 +0000
committerdavidn <davidn@FreeBSD.org>1997-02-10 06:18:20 +0000
commit57d260df48d14ff97548a20b9aff1afba08a7c42 (patch)
tree15775f0f14e7b02a07fe32d41c1d8398897cfab3 /sys/kern/kern_prot.c
parent10f666af84d48e89e4e2960415c9b616fce4077f (diff)
downloadFreeBSD-src-57d260df48d14ff97548a20b9aff1afba08a7c42.zip
FreeBSD-src-57d260df48d14ff97548a20b9aff1afba08a7c42.tar.gz
Fix off by one error in setlogin() syscall.
Don't overwrite session login unless the call is going to succeed.
Diffstat (limited to 'sys/kern/kern_prot.c')
-rw-r--r--sys/kern/kern_prot.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index 0af63f9..29f5635 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -683,13 +683,16 @@ setlogin(p, uap, retval)
int *retval;
{
int error;
+ char logintmp[sizeof(p->p_pgrp->pg_session->s_login)];
if ((error = suser(p->p_ucred, &p->p_acflag)))
return (error);
- error = copyinstr((caddr_t) uap->namebuf,
- (caddr_t) p->p_pgrp->pg_session->s_login,
- sizeof (p->p_pgrp->pg_session->s_login) - 1, (u_int *)0);
+ error = copyinstr((caddr_t) uap->namebuf, (caddr_t) logintmp,
+ sizeof(logintmp), (u_int *)0);
if (error == ENAMETOOLONG)
error = EINVAL;
+ else if (!error)
+ (void) memcpy(p->p_pgrp->pg_session->s_login, logintmp,
+ sizeof(p->p_pgrp->pg_session->s_login));
return (error);
}
OpenPOWER on IntegriCloud