diff options
| author | martin <martin@NetBSD.org> | 2017-12-26 12:43:59 +0000 |
|---|---|---|
| committer | martin <martin@NetBSD.org> | 2017-12-26 12:43:59 +0000 |
| commit | 480528d4c5daa656eed554e84ca7b4259cf6225a (patch) | |
| tree | 417d8a4befafca6fa3f537c34093aa3efa68e898 /sys/modules/lua/lua.c | |
| parent | 00904c4e2bd30f020a4064d291ced918bf6e06d8 (diff) | |
Fix cargo cult ioctl implementation for LUAINFO: the name and desc fields
are arrays, not pointers, so don't use copyoutstr on them, but instead
copyin/copyout the whole array of structures.
Fixes PR 52864 for me (on sparc64).
Diffstat (limited to 'sys/modules/lua/lua.c')
| -rw-r--r-- | sys/modules/lua/lua.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/sys/modules/lua/lua.c b/sys/modules/lua/lua.c index aa7dac662ef..8d9dcc702da 100644 --- a/sys/modules/lua/lua.c +++ b/sys/modules/lua/lua.c @@ -1,4 +1,4 @@ -/* $NetBSD: lua.c,v 1.23 2017/05/20 09:46:17 mbalmer Exp $ */ +/* $NetBSD: lua.c,v 1.24 2017/12/26 12:43:59 martin Exp $ */ /* * Copyright (c) 2011 - 2017 by Marc Balmer <mbalmer@NetBSD.org>. @@ -288,6 +288,7 @@ luaioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) struct pathbuf *pb; struct vattr va; struct lua_loadstate ls; + struct lua_state_info *states; int error, n; klua_State *K; @@ -307,14 +308,25 @@ luaioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) LIST_FOREACH(s, &lua_states, lua_next) { if (n > info->num_states) break; - copyoutstr(s->lua_name, info->states[n].name, - MAX_LUA_NAME, NULL); - copyoutstr(s->lua_desc, info->states[n].desc, - MAX_LUA_DESC, NULL); - info->states[n].user = s->K->ks_user; n++; } info->num_states = n; + states = kmem_alloc(sizeof(*states) * n, KM_SLEEP); + if (copyin(info->states, states, sizeof(*states) * n) + == 0) { + n = 0; + LIST_FOREACH(s, &lua_states, lua_next) { + if (n > info->num_states) + break; + strcpy(states[n].name, s->lua_name); + strcpy(states[n].desc, s->lua_desc); + states[n].user = s->K->ks_user; + n++; + } + copyout(states, info->states, + sizeof(*states) * n); + kmem_free(states, sizeof(*states) * n); + } } break; case LUACREATE: |
