diff options
author | davidn <davidn@FreeBSD.org> | 1997-02-10 06:18:20 +0000 |
---|---|---|
committer | davidn <davidn@FreeBSD.org> | 1997-02-10 06:18:20 +0000 |
commit | 57d260df48d14ff97548a20b9aff1afba08a7c42 (patch) | |
tree | 15775f0f14e7b02a07fe32d41c1d8398897cfab3 /sys/kern | |
parent | 10f666af84d48e89e4e2960415c9b616fce4077f (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/kern/kern_prot.c | 9 |
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); } |