1
0
mirror of https://github.com/openbsd/src.git synced 2026-06-18 07:13:36 +02:00

Use temporary buffer to copyout login name within sys_getlogin_r().

Load the session pointer to the `s' variable after new login name
was copied from the userland within sys_setlogin().

ok deraadt claudio
This commit is contained in:
mvs
2026-06-10 04:46:18 +00:00
parent def7607e31
commit bacaadd776
+8 -5
View File
@@ -1,4 +1,4 @@
/* $OpenBSD: kern_prot.c,v 1.85 2026/06/10 04:45:22 mvs Exp $ */
/* $OpenBSD: kern_prot.c,v 1.86 2026/06/10 04:46:18 mvs Exp $ */
/* $NetBSD: kern_prot.c,v 1.33 1996/02/09 18:59:42 christos Exp $ */
/*
@@ -1032,11 +1032,13 @@ sys_getlogin_r(struct proc *p, void *v, register_t *retval)
} */ *uap = v;
size_t namelen = SCARG(uap, namelen);
struct session *s = p->p_p->ps_pgrp->pg_session;
char buf[sizeof(s->s_login)];
int error;
if (namelen > sizeof(s->s_login))
namelen = sizeof(s->s_login);
error = copyoutstr(s->s_login, SCARG(uap, namebuf), namelen, NULL);
strlcpy(buf, s->s_login, namelen);
error = copyoutstr(buf, SCARG(uap, namebuf), namelen, NULL);
if (error == ENAMETOOLONG)
error = ERANGE;
*retval = error;
@@ -1052,16 +1054,17 @@ sys_setlogin(struct proc *p, void *v, register_t *retval)
struct sys_setlogin_args /* {
syscallarg(const char *) namebuf;
} */ *uap = v;
struct session *s = p->p_p->ps_pgrp->pg_session;
struct session *s;
char buf[sizeof(s->s_login)];
int error;
if ((error = suser(p)) != 0)
return (error);
error = copyinstr(SCARG(uap, namebuf), buf, sizeof(buf), NULL);
if (error == 0)
if (error == 0) {
s = p->p_p->ps_pgrp->pg_session;
strlcpy(s->s_login, buf, sizeof(s->s_login));
else if (error == ENAMETOOLONG)
} else if (error == ENAMETOOLONG)
error = EINVAL;
return (error);
}