From d5ba7564d888383ddbfd18ddff70acba39e0a750 Mon Sep 17 00:00:00 2001 From: christos Date: Fri, 9 Jun 2006 23:24:24 +0000 Subject: [PATCH] stack police: don't allocate statvfs on the stack. --- sys/compat/svr4/svr4_misc.c | 81 ++++++++++++++++++------------- sys/compat/svr4_32/svr4_32_misc.c | 79 +++++++++++++++++------------- 2 files changed, 92 insertions(+), 68 deletions(-) diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c index 383f9a892476..03534e09feb4 100644 --- a/sys/compat/svr4/svr4_misc.c +++ b/sys/compat/svr4/svr4_misc.c @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_misc.c,v 1.116 2006/03/01 12:38:12 yamt Exp $ */ +/* $NetBSD: svr4_misc.c,v 1.117 2006/06/09 23:24:24 christos Exp $ */ /*- * Copyright (c) 1994 The NetBSD Foundation, Inc. @@ -44,7 +44,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.116 2006/03/01 12:38:12 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.117 2006/06/09 23:24:24 christos Exp $"); #include #include @@ -114,6 +114,8 @@ static void bsd_statvfs_to_svr4_statvfs __P((const struct statvfs *, struct svr4_statvfs *)); static void bsd_statvfs_to_svr4_statvfs64 __P((const struct statvfs *, struct svr4_statvfs64 *)); +static int svr4_copystatvfs64(struct svr4_statvfs64 *, const struct statvfs *); +static int svr4_copystatvfs(struct svr4_statvfs *, const struct statvfs *); #define svr4_pfind(pid) p_find((pid), PFIND_UNLOCK | PFIND_ZOMBIE) static int svr4_mknod __P((struct lwp *, register_t *, const char *, @@ -1228,6 +1230,44 @@ svr4_sys_waitsys(l, v, retval) } +static int +svr4_copystatvfs64(struct svr4_statvfs64 *sufs, const struct statvfs *bufs) +{ + struct svr4_statvfs64 *skfs = malloc(sizeof(*skfs), M_TEMP, M_WAITOK); + struct statvfs *bkfs = malloc(sizeof(*bkfs), M_TEMP, M_WAITOK); + int error; + + if ((error = copyin(sufs, bkfs, sizeof(*bkfs))) != 0) + goto out; + + bsd_statvfs_to_svr4_statvfs64(bkfs, skfs); + + error = copyout(skfs, sufs, sizeof(*skfs)); +out: + free(skfs, M_TEMP); + free(bkfs, M_TEMP); + return error; +} + +static int +svr4_copystatvfs(struct svr4_statvfs *sufs, const struct statvfs *bufs) +{ + struct svr4_statvfs *skfs = malloc(sizeof(*skfs), M_TEMP, M_WAITOK); + struct statvfs *bkfs = malloc(sizeof(*bkfs), M_TEMP, M_WAITOK); + int error; + + if ((error = copyin(bufs, bkfs, sizeof(*bkfs))) != 0) + goto out; + + bsd_statvfs_to_svr4_statvfs(bkfs, skfs); + + error = copyout(skfs, sufs, sizeof(*skfs)); +out: + free(skfs, M_TEMP); + free(bkfs, M_TEMP); + return error; +} + static void bsd_statvfs_to_svr4_statvfs(const struct statvfs *bfs, struct svr4_statvfs *sfs) @@ -1289,8 +1329,6 @@ svr4_sys_statvfs(l, v, retval) struct proc *p = l->l_proc; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_statvfs sfs; int error; CHECK_ALT_EXIST(l, &sg, SCARG(uap, path)); @@ -1301,12 +1339,7 @@ svr4_sys_statvfs(l, v, retval) if ((error = sys_statvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_statvfs(&bfs, &sfs); - - return copyout(&sfs, SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs(SCARG(uap, fs), fs); } @@ -1321,8 +1354,6 @@ svr4_sys_fstatvfs(l, v, retval) struct sys_fstatvfs1_args fs_args; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_statvfs sfs; int error; SCARG(&fs_args, fd) = SCARG(uap, fd); @@ -1332,12 +1363,7 @@ svr4_sys_fstatvfs(l, v, retval) if ((error = sys_fstatvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_statvfs(&bfs, &sfs); - - return copyout(&sfs, SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs(SCARG(uap, fs), fs); } @@ -1352,8 +1378,6 @@ svr4_sys_statvfs64(l, v, retval) struct sys_statvfs1_args fs_args; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_statvfs64 sfs; int error; CHECK_ALT_EXIST(l, &sg, SCARG(uap, path)); @@ -1364,12 +1388,7 @@ svr4_sys_statvfs64(l, v, retval) if ((error = sys_statvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_statvfs64(&bfs, &sfs); - - return copyout(&sfs, SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs64(SCARG(uap, fs), fs); } @@ -1384,8 +1403,6 @@ svr4_sys_fstatvfs64(l, v, retval) struct sys_fstatvfs1_args fs_args; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_statvfs64 sfs; int error; SCARG(&fs_args, fd) = SCARG(uap, fd); @@ -1395,15 +1412,11 @@ svr4_sys_fstatvfs64(l, v, retval) if ((error = sys_fstatvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_statvfs64(&bfs, &sfs); - - return copyout(&sfs, SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs64(SCARG(uap, fs), fs); } + int svr4_sys_alarm(l, v, retval) struct lwp *l; diff --git a/sys/compat/svr4_32/svr4_32_misc.c b/sys/compat/svr4_32/svr4_32_misc.c index 0d212b559d52..51f2daf6c470 100644 --- a/sys/compat/svr4_32/svr4_32_misc.c +++ b/sys/compat/svr4_32/svr4_32_misc.c @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_32_misc.c,v 1.35 2006/03/01 12:38:12 yamt Exp $ */ +/* $NetBSD: svr4_32_misc.c,v 1.36 2006/06/09 23:24:25 christos Exp $ */ /*- * Copyright (c) 1994 The NetBSD Foundation, Inc. @@ -44,7 +44,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.35 2006/03/01 12:38:12 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.36 2006/06/09 23:24:25 christos Exp $"); #include #include @@ -114,6 +114,8 @@ static void bsd_statvfs_to_svr4_32_statvfs __P((const struct statvfs *, struct svr4_32_statvfs *)); static void bsd_statvfs_to_svr4_32_statvfs64 __P((const struct statvfs *, struct svr4_32_statvfs64 *)); +static int svr4_copystatvfs64(struct svr4_32_statvfs64 *, const struct statvfs *); +static int svr4_copystatvfs(struct svr4_32_statvfs *, const struct statvfs *); #define svr4_32_pfind(pid) p_find((pid), PFIND_UNLOCK | PFIND_ZOMBIE) static int svr4_32_mknod __P((struct lwp *, register_t *, const char *, @@ -1245,6 +1247,43 @@ svr4_32_sys_waitsys(l, v, retval) SCARG(uap, info)); } +static int +svr4_copystatvfs64(struct svr4_32_statvfs64 *sufs, const struct statvfs *bufs) +{ + struct svr4_statvfs64 *skfs = malloc(sizeof(*skfs), M_TEMP, M_WAITOK); + struct statvfs *bkfs = malloc(sizeof(*bkfs), M_TEMP, M_WAITOK); + int error; + + if ((error = copyin(sufs, bkfs, sizeof(*bkfs))) != 0) + goto out; + + bsd_statvfs_to_svr4_statvfs64(bkfs, skfs); + + error = copyout(skfs, sufs, sizeof(*skfs)); +out: + free(skfs, M_TEMP); + free(bkfs, M_TEMP); + return error; +} + +static int +svr4_copystatvfs(struct svr4_32_statvfs *sufs, const struct statvfs *bufs) +{ + struct svr4_statvfs *skfs = malloc(sizeof(*skfs), M_TEMP, M_WAITOK); + struct statvfs *bkfs = malloc(sizeof(*bkfs), M_TEMP, M_WAITOK); + int error; + + if ((error = copyin(bufs, bkfs, sizeof(*bkfs))) != 0) + goto out; + + bsd_statvfs_to_svr4_statvfs(bkfs, skfs); + + error = copyout(skfs, sufs, sizeof(*skfs)); +out: + free(skfs, M_TEMP); + free(bkfs, M_TEMP); + return error; +} static void bsd_statvfs_to_svr4_32_statvfs(bfs, sfs) @@ -1309,8 +1348,6 @@ svr4_32_sys_statvfs(l, v, retval) struct sys_statvfs1_args fs_args; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_32_statvfs sfs; int error; SCARG(&fs_args, path) = (caddr_t)(u_long)SCARG(uap, path); @@ -1321,12 +1358,7 @@ svr4_32_sys_statvfs(l, v, retval) if ((error = sys_statvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_32_statvfs(&bfs, &sfs); - - return copyout(&sfs, (caddr_t)(u_long)SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs(SCARG(uap, fs), fs); } @@ -1341,8 +1373,6 @@ svr4_32_sys_fstatvfs(l, v, retval) struct sys_fstatvfs1_args fs_args; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_32_statvfs sfs; int error; SCARG(&fs_args, fd) = SCARG(uap, fd); @@ -1352,12 +1382,7 @@ svr4_32_sys_fstatvfs(l, v, retval) if ((error = sys_fstatvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_32_statvfs(&bfs, &sfs); - - return copyout(&sfs, (caddr_t)(u_long)SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs(SCARG(uap, fs), fs); } @@ -1372,8 +1397,6 @@ svr4_32_sys_statvfs64(l, v, retval) struct proc *p = l->l_proc; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_32_statvfs64 sfs; int error; SCARG(&fs_args, path) = (caddr_t)(u_long)SCARG(uap, path); @@ -1384,12 +1407,7 @@ svr4_32_sys_statvfs64(l, v, retval) if ((error = sys_statvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_32_statvfs64(&bfs, &sfs); - - return copyout(&sfs, (caddr_t)(u_long)SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs64(SCARG(uap, fs), fs); } @@ -1404,8 +1422,6 @@ svr4_32_sys_fstatvfs64(l, v, retval) struct sys_fstatvfs1_args fs_args; caddr_t sg = stackgap_init(p, 0); struct statvfs *fs = stackgap_alloc(p, &sg, sizeof(struct statvfs)); - struct statvfs bfs; - struct svr4_32_statvfs64 sfs; int error; SCARG(&fs_args, fd) = SCARG(uap, fd); @@ -1415,12 +1431,7 @@ svr4_32_sys_fstatvfs64(l, v, retval) if ((error = sys_fstatvfs1(l, &fs_args, retval)) != 0) return error; - if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0) - return error; - - bsd_statvfs_to_svr4_32_statvfs64(&bfs, &sfs); - - return copyout(&sfs, (caddr_t)(u_long)SCARG(uap, fs), sizeof(sfs)); + return svr4_copystatvfs64(SCARG(uap, fs), fs); }