Get rid of usrstack/USRSTACK. Document that the old version of getargv is

broken because of ASLR.
This commit is contained in:
christos 2022-01-10 19:51:30 +00:00
parent 906a0c5ecd
commit 104ea67795
19 changed files with 41 additions and 60 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm.c,v 1.109 2020/05/02 14:31:13 christos Exp $ */
/* $NetBSD: kvm.c,v 1.110 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1989, 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm.c 8.2 (Berkeley) 2/13/94";
#else
__RCSID("$NetBSD: kvm.c,v 1.109 2020/05/02 14:31:13 christos Exp $");
__RCSID("$NetBSD: kvm.c,v 1.110 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -289,7 +289,7 @@ _kvm_open(kvm_t *kd, const char *uf, const char *mf, const char *sf, int flag,
/*
* Call the MD open hook. This sets:
* usrstack, min_uva, max_uva
* min_uva, max_uva
*/
if (_kvm_mdopen(kd)) {
_kvm_err(kd, kd->program, "md init failed");

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_aarch64.c,v 1.10 2020/11/10 19:14:11 skrll Exp $ */
/* $NetBSD: kvm_aarch64.c,v 1.11 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 2014, 2018 The NetBSD Foundation, Inc.
@ -49,7 +49,7 @@
#include "kvm_private.h"
__RCSID("$NetBSD: kvm_aarch64.c,v 1.10 2020/11/10 19:14:11 skrll Exp $");
__RCSID("$NetBSD: kvm_aarch64.c,v 1.11 2022/01/10 19:51:30 christos Exp $");
/*ARGSUSED*/
void
@ -197,7 +197,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_alpha.c,v 1.27 2014/02/19 20:21:22 dsl Exp $ */
/* $NetBSD: kvm_alpha.c,v 1.28 2022/01/10 19:51:30 christos Exp $ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@ -50,7 +50,7 @@
#include "kvm_private.h"
__RCSID("$NetBSD: kvm_alpha.c,v 1.27 2014/02/19 20:21:22 dsl Exp $");
__RCSID("$NetBSD: kvm_alpha.c,v 1.28 2022/01/10 19:51:30 christos Exp $");
/*ARGSUSED*/
void
@ -186,7 +186,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_arm.c,v 1.6 2010/09/20 23:23:16 jym Exp $ */
/* $NetBSD: kvm_arm.c,v 1.7 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (C) 1996 Wolfgang Solfrank.
@ -39,7 +39,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: kvm_arm.c,v 1.6 2010/09/20 23:23:16 jym Exp $");
__RCSID("$NetBSD: kvm_arm.c,v 1.7 2022/01/10 19:51:30 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@ -194,13 +194,11 @@ _kvm_mdopen(kvm_t * kd)
extern struct ps_strings *__ps_strings;
#if 0 /* XXX - These vary across arm machines... */
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;
#endif
/* This is somewhat hack-ish, but it works. */
max_uva = (uintptr_t) (__ps_strings + 1);
kd->usrstack = max_uva;
kd->max_uva = max_uva;
kd->min_uva = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_hppa.c,v 1.7 2014/02/19 20:21:22 dsl Exp $ */
/* $NetBSD: kvm_hppa.c,v 1.8 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1989, 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: kvm_hppa.c,v 1.7 2014/02/19 20:21:22 dsl Exp $");
__RCSID("$NetBSD: kvm_hppa.c,v 1.8 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -197,7 +197,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_i386.c,v 1.31 2020/04/25 05:17:16 maxv Exp $ */
/* $NetBSD: kvm_i386.c,v 1.32 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1989, 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: kvm_i386.c,v 1.31 2020/04/25 05:17:16 maxv Exp $");
__RCSID("$NetBSD: kvm_i386.c,v 1.32 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -228,7 +228,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_m68k.c,v 1.19 2014/01/27 21:00:01 matt Exp $ */
/* $NetBSD: kvm_m68k.c,v 1.20 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@ -59,7 +59,7 @@
#include "kvm_private.h"
#include "kvm_m68k.h"
__RCSID("$NetBSD: kvm_m68k.c,v 1.19 2014/01/27 21:00:01 matt Exp $");
__RCSID("$NetBSD: kvm_m68k.c,v 1.20 2022/01/10 19:51:30 christos Exp $");
struct name_ops {
const char *name;
@ -157,13 +157,11 @@ _kvm_mdopen(kvm_t *kd)
extern struct ps_strings *__ps_strings;
#if 0 /* XXX - These vary across m68k machines... */
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;
#endif
/* This is somewhat hack-ish, but it works. */
max_uva = (u_long) (__ps_strings + 1);
kd->usrstack = max_uva;
kd->max_uva = max_uva;
kd->min_uva = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_mips.c,v 1.22 2014/02/19 20:21:22 dsl Exp $ */
/* $NetBSD: kvm_mips.c,v 1.23 2022/01/10 19:51:30 christos Exp $ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: kvm_mips.c,v 1.22 2014/02/19 20:21:22 dsl Exp $");
__RCSID("$NetBSD: kvm_mips.c,v 1.23 2022/01/10 19:51:30 christos Exp $");
#endif /* LIBC_SCCS and not lint */
/*
@ -236,7 +236,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_or1k.c,v 1.1 2014/09/03 19:34:26 matt Exp $ */
/* $NetBSD: kvm_or1k.c,v 1.2 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@ -51,7 +51,7 @@
#include <machine/kcore.h>
#include <machine/vmparam.h>
__RCSID("$NetBSD: kvm_or1k.c,v 1.1 2014/09/03 19:34:26 matt Exp $");
__RCSID("$NetBSD: kvm_or1k.c,v 1.2 2022/01/10 19:51:30 christos Exp $");
void
_kvm_freevtop(kvm_t *kd)
@ -118,7 +118,6 @@ _kvm_pa2off(kvm_t *kd, paddr_t pa)
int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_powerpc.c,v 1.13 2014/01/27 21:00:01 matt Exp $ */
/* $NetBSD: kvm_powerpc.c,v 1.14 2022/01/10 19:51:30 christos Exp $ */
/*
* Copyright (c) 2005 Wasabi Systems, Inc.
@ -91,7 +91,7 @@
#include <powerpc/oea/bat.h>
#include <powerpc/oea/pte.h>
__RCSID("$NetBSD: kvm_powerpc.c,v 1.13 2014/01/27 21:00:01 matt Exp $");
__RCSID("$NetBSD: kvm_powerpc.c,v 1.14 2022/01/10 19:51:30 christos Exp $");
static int _kvm_match_601bat(kvm_t *, vaddr_t, paddr_t *, int *);
static int _kvm_match_bat(kvm_t *, vaddr_t, paddr_t *, int *);
@ -367,13 +367,11 @@ _kvm_mdopen(kvm_t *kd)
extern struct ps_strings *__ps_strings;
#if 0 /* XXX - These vary across powerpc machines... */
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;
#endif
/* This is somewhat hack-ish, but it works. */
max_uva = (uintptr_t) (__ps_strings + 1);
kd->usrstack = max_uva;
kd->max_uva = max_uva;
kd->min_uva = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_powerpc64.c,v 1.6 2014/08/23 02:25:23 matt Exp $ */
/* $NetBSD: kvm_powerpc64.c,v 1.7 2022/01/10 19:51:30 christos Exp $ */
/*
* Copyright (c) 2005 Wasabi Systems, Inc.
@ -90,7 +90,7 @@
#include <powerpc/oea/bat.h>
#include <powerpc/oea/pte.h>
__RCSID("$NetBSD: kvm_powerpc64.c,v 1.6 2014/08/23 02:25:23 matt Exp $");
__RCSID("$NetBSD: kvm_powerpc64.c,v 1.7 2022/01/10 19:51:30 christos Exp $");
void
_kvm_freevtop(kvm_t *kd)
@ -170,13 +170,11 @@ _kvm_mdopen(kvm_t *kd)
extern struct ps_strings *__ps_strings;
#if 0 /* XXX - These vary across powerpc machines... */
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;
#endif
/* This is somewhat hack-ish, but it works. */
max_uva = (uintptr_t) (__ps_strings + 1);
kd->usrstack = max_uva;
kd->max_uva = max_uva;
kd->min_uva = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_private.h,v 1.21 2020/04/28 00:12:01 christos Exp $ */
/* $NetBSD: kvm_private.h,v 1.22 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -55,7 +55,6 @@ struct __kvm {
size_t procbase_len;
size_t procbase2_len;
size_t lwpbase_len;
u_long usrstack; /* address of end of user stack */
u_long min_uva, max_uva; /* min/max user virtual address */
int nbpg; /* page size */
char *swapspc; /* (dynamic) storage for swapped pages */

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_proc.c,v 1.95 2021/07/19 10:30:36 christos Exp $ */
/* $NetBSD: kvm_proc.c,v 1.96 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -67,7 +67,7 @@
#if 0
static char sccsid[] = "@(#)kvm_proc.c 8.3 (Berkeley) 9/23/93";
#else
__RCSID("$NetBSD: kvm_proc.c,v 1.95 2021/07/19 10:30:36 christos Exp $");
__RCSID("$NetBSD: kvm_proc.c,v 1.96 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -1057,6 +1057,7 @@ proc_verify(kvm_t *kd, u_long kernp, const struct miniproc *p)
(kernproc.p_stat != SZOMB || p->p_stat == SZOMB));
}
extern struct ps_strings *__ps_strings;
static char **
kvm_doargv(kvm_t *kd, const struct miniproc *p, int nchr,
void (*info)(struct ps_strings *, u_long *, int *))
@ -1071,7 +1072,8 @@ kvm_doargv(kvm_t *kd, const struct miniproc *p, int nchr,
*/
if (p->p_stat == SZOMB)
return (NULL);
cnt = (int)kvm_ureadm(kd, p, kd->usrstack - sizeof(arginfo),
/* XXX: this is broken for ASLR: we need to read p->p_psstr instead */
cnt = (int)kvm_ureadm(kd, p, (u_long)(intptr_t)__ps_strings,
(void *)&arginfo, sizeof(arginfo));
if (cnt != sizeof(arginfo))
return (NULL);

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_riscv.c,v 1.1 2014/09/19 17:36:25 matt Exp $ */
/* $NetBSD: kvm_riscv.c,v 1.2 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@ -51,7 +51,7 @@
#include <machine/kcore.h>
#include <machine/vmparam.h>
__RCSID("$NetBSD: kvm_riscv.c,v 1.1 2014/09/19 17:36:25 matt Exp $");
__RCSID("$NetBSD: kvm_riscv.c,v 1.2 2022/01/10 19:51:30 christos Exp $");
void
_kvm_freevtop(kvm_t *kd)
@ -118,7 +118,6 @@ _kvm_pa2off(kvm_t *kd, paddr_t pa)
int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_sh3.c,v 1.9 2014/02/19 20:21:22 dsl Exp $ */
/* $NetBSD: kvm_sh3.c,v 1.10 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1989, 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: kvm_sh3.c,v 1.9 2014/02/19 20:21:22 dsl Exp $");
__RCSID("$NetBSD: kvm_sh3.c,v 1.10 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -118,7 +118,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_sparc.c,v 1.35 2015/10/31 02:40:44 nakayama Exp $ */
/* $NetBSD: kvm_sparc.c,v 1.36 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm_sparc.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: kvm_sparc.c,v 1.35 2015/10/31 02:40:44 nakayama Exp $");
__RCSID("$NetBSD: kvm_sparc.c,v 1.36 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -382,7 +382,6 @@ _kvm_mdopen(kvm_t *kd)
extern struct ps_strings *__ps_strings;
max_uva = (u_long) (__ps_strings + 1);
kd->usrstack = max_uva;
kd->max_uva = max_uva;
kd->min_uva = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_sparc64.c,v 1.17 2014/02/21 18:00:09 palle Exp $ */
/* $NetBSD: kvm_sparc64.c,v 1.18 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm_sparc.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: kvm_sparc64.c,v 1.17 2014/02/21 18:00:09 palle Exp $");
__RCSID("$NetBSD: kvm_sparc64.c,v 1.18 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -273,7 +273,6 @@ _kvm_mdopen(kvm_t *kd)
extern struct ps_strings *__ps_strings;
max_uva = (u_long) (__ps_strings + 1);
kd->usrstack = max_uva;
kd->max_uva = max_uva;
kd->min_uva = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_vax.c,v 1.20 2014/02/19 20:21:22 dsl Exp $ */
/* $NetBSD: kvm_vax.c,v 1.21 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -59,7 +59,7 @@
#include "kvm_private.h"
__RCSID("$NetBSD: kvm_vax.c,v 1.20 2014/02/19 20:21:22 dsl Exp $");
__RCSID("$NetBSD: kvm_vax.c,v 1.21 2022/01/10 19:51:30 christos Exp $");
struct vmstate {
u_long end;
@ -150,7 +150,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;

View File

@ -1,4 +1,4 @@
/* $NetBSD: kvm_x86_64.c,v 1.12 2020/04/25 05:17:16 maxv Exp $ */
/* $NetBSD: kvm_x86_64.c,v 1.13 2022/01/10 19:51:30 christos Exp $ */
/*-
* Copyright (c) 1989, 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: kvm_x86_64.c,v 1.12 2020/04/25 05:17:16 maxv Exp $");
__RCSID("$NetBSD: kvm_x86_64.c,v 1.13 2022/01/10 19:51:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -269,7 +269,6 @@ int
_kvm_mdopen(kvm_t *kd)
{
kd->usrstack = USRSTACK;
kd->min_uva = VM_MIN_ADDRESS;
kd->max_uva = VM_MAXUSER_ADDRESS;