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).
This commit is contained in:
martin 2017-12-26 12:43:59 +00:00
parent 304fae425d
commit 63f6d58f43
1 changed files with 18 additions and 6 deletions

View File

@ -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: