2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 01:49:11 +00:00

Use int, not short for events in the event API.

This fixes some -Wconversion warnings and fixes an inconsistency
between the libsudo_util event API and the plugin event API.  The
actual struct internals still use shorts to avoid changing the ABI.
This commit is contained in:
Todd C. Miller 2023-08-09 13:22:12 -06:00
parent 0f2e5dae90
commit 811051d32a
5 changed files with 44 additions and 19 deletions

View File

@ -126,7 +126,8 @@ sudo_dso_public void sudo_ev_base_setdef_v1(struct sudo_event_base *base);
/* Allocate a new event. */
sudo_dso_public struct sudo_event *sudo_ev_alloc_v1(int fd, short events, sudo_ev_callback_t callback, void *closure);
#define sudo_ev_alloc(_a, _b, _c, _d) sudo_ev_alloc_v1((_a), (_b), (_c), (_d))
sudo_dso_public struct sudo_event *sudo_ev_alloc_v2(int fd, int events, sudo_ev_callback_t callback, void *closure);
#define sudo_ev_alloc(_a, _b, _c, _d) sudo_ev_alloc_v2((_a), (_b), (_c), (_d))
/* Free an event. */
sudo_dso_public void sudo_ev_free_v1(struct sudo_event *ev);
@ -134,7 +135,8 @@ sudo_dso_public void sudo_ev_free_v1(struct sudo_event *ev);
/* Set an event struct that was pre-allocated. */
sudo_dso_public int sudo_ev_set_v1(struct sudo_event *ev, int fd, short events, sudo_ev_callback_t callback, void *closure);
#define sudo_ev_set(_a, _b, _c, _d, _e) sudo_ev_set_v1((_a), (_b), (_c), (_d), (_e))
sudo_dso_public int sudo_ev_set_v2(struct sudo_event *ev, int fd, int events, sudo_ev_callback_t callback, void *closure);
#define sudo_ev_set(_a, _b, _c, _d, _e) sudo_ev_set_v2((_a), (_b), (_c), (_d), (_e))
/* Add an event, returns 0 on success, -1 on error */
sudo_dso_public int sudo_ev_add_v1(struct sudo_event_base *head, struct sudo_event *ev, const struct timeval *timo, bool tohead);
@ -155,7 +157,8 @@ sudo_dso_public int sudo_ev_loop_v1(struct sudo_event_base *head, unsigned int f
/* Return pending event types, fills in ts if non-NULL and there is a timeout */
sudo_dso_public int sudo_ev_pending_v1(struct sudo_event *ev, short events, struct timespec *ts);
#define sudo_ev_pending(_a, _b, _c) sudo_ev_pending_v1((_a), (_b), (_c))
sudo_dso_public int sudo_ev_pending_v2(struct sudo_event *ev, int events, struct timespec *ts);
#define sudo_ev_pending(_a, _b, _c) sudo_ev_pending_v2((_a), (_b), (_c))
/* Return the remaining timeout associated with an event (deprecated). */
sudo_dso_public int sudo_ev_get_timeleft_v1(struct sudo_event *ev, struct timeval *tv);

View File

@ -44,7 +44,7 @@
#include "sudo_event.h"
#include "sudo_util.h"
static void sudo_ev_init(struct sudo_event *ev, int fd, short events,
static void sudo_ev_init(struct sudo_event *ev, int fd, int events,
sudo_ev_callback_t callback, void *closure);
/* Default event base when none is specified. */
@ -263,7 +263,7 @@ sudo_ev_base_setdef_v1(struct sudo_event_base *base)
* Clear and fill in a struct sudo_event.
*/
static void
sudo_ev_init(struct sudo_event *ev, int fd, short events,
sudo_ev_init(struct sudo_event *ev, int fd, int events,
sudo_ev_callback_t callback, void *closure)
{
debug_decl(sudo_ev_init, SUDO_DEBUG_EVENT);
@ -283,7 +283,7 @@ sudo_ev_init(struct sudo_event *ev, int fd, short events,
* Allocates space for siginfo_t for SUDO_EV_SIGINFO as needed.
*/
int
sudo_ev_set_v1(struct sudo_event *ev, int fd, short events,
sudo_ev_set_v2(struct sudo_event *ev, int fd, int events,
sudo_ev_callback_t callback, void *closure)
{
debug_decl(sudo_ev_set, SUDO_DEBUG_EVENT);
@ -305,8 +305,15 @@ sudo_ev_set_v1(struct sudo_event *ev, int fd, short events,
debug_return_int(0);
}
int
sudo_ev_set_v1(struct sudo_event *ev, int fd, short events,
sudo_ev_callback_t callback, void *closure)
{
return sudo_ev_set_v2(ev, fd, events, callback, closure);
}
struct sudo_event *
sudo_ev_alloc_v1(int fd, short events, sudo_ev_callback_t callback, void *closure)
sudo_ev_alloc_v2(int fd, int events, sudo_ev_callback_t callback, void *closure)
{
struct sudo_event *ev;
debug_decl(sudo_ev_alloc, SUDO_DEBUG_EVENT);
@ -324,6 +331,12 @@ sudo_ev_alloc_v1(int fd, short events, sudo_ev_callback_t callback, void *closur
debug_return_ptr(ev);
}
struct sudo_event *
sudo_ev_alloc_v1(int fd, short events, sudo_ev_callback_t callback, void *closure)
{
return sudo_ev_alloc_v2(fd, events, callback, closure);
}
void
sudo_ev_free_v1(struct sudo_event *ev)
{
@ -833,7 +846,7 @@ sudo_ev_get_timeleft_v2(struct sudo_event *ev, struct timespec *ts)
}
int
sudo_ev_pending_v1(struct sudo_event *ev, short events, struct timespec *ts)
sudo_ev_pending_v2(struct sudo_event *ev, int events, struct timespec *ts)
{
int ret;
debug_decl(sudo_ev_pending, SUDO_DEBUG_EVENT);
@ -860,3 +873,9 @@ sudo_ev_pending_v1(struct sudo_event *ev, short events, struct timespec *ts)
debug_return_int(ret);
}
int
sudo_ev_pending_v1(struct sudo_event *ev, short events, struct timespec *ts)
{
return sudo_ev_pending_v2(ev, events, ts);
}

View File

@ -120,7 +120,7 @@ sudo_ev_add_impl(struct sudo_event_base *base, struct sudo_event *ev)
/* Fill in pfd entry. */
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"%s: choosing free slot %d", __func__, base->pfd_free);
ev->pfd_idx = base->pfd_free;
ev->pfd_idx = (short)base->pfd_free;
pfd = &base->pfds[ev->pfd_idx];
pfd->fd = ev->fd;
pfd->events = 0;
@ -226,7 +226,7 @@ sudo_ev_scan_impl(struct sudo_event_base *base, unsigned int flags)
sudo_debug_printf(SUDO_DEBUG_DEBUG,
"%s: polled fd %d, events %d, activating %p",
__func__, ev->fd, what, ev);
ev->revents = what;
ev->revents = (short)what;
sudo_ev_activate(base, ev);
}
}

View File

@ -82,14 +82,14 @@ sudo_ev_add_impl(struct sudo_event_base *base, struct sudo_event *ev)
if (ev->fd > base->maxfd) {
const int o = (base->maxfd + 1) / NFDBITS;
const int n = howmany(ev->fd + 1, NFDBITS);
const size_t used_bytes = o * sizeof(fd_mask);
const size_t new_bytes = (n - o) * sizeof(fd_mask);
const size_t used_bytes = (size_t)o * sizeof(fd_mask);
const size_t new_bytes = (size_t)(n - o) * sizeof(fd_mask);
fd_set *rfds_in, *wfds_in, *rfds_out, *wfds_out;
rfds_in = reallocarray(base->readfds_in, n, sizeof(fd_mask));
wfds_in = reallocarray(base->writefds_in, n, sizeof(fd_mask));
rfds_out = reallocarray(base->readfds_out, n, sizeof(fd_mask));
wfds_out = reallocarray(base->writefds_out, n, sizeof(fd_mask));
rfds_in = reallocarray(base->readfds_in, (size_t)n, sizeof(fd_mask));
wfds_in = reallocarray(base->writefds_in, (size_t)n, sizeof(fd_mask));
rfds_out = reallocarray(base->readfds_out, (size_t)n, sizeof(fd_mask));
wfds_out = reallocarray(base->writefds_out, (size_t)n, sizeof(fd_mask));
if (rfds_in == NULL || wfds_in == NULL ||
rfds_out == NULL || wfds_out == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
@ -209,7 +209,7 @@ sudo_ev_scan_impl(struct sudo_event_base *base, unsigned int flags)
}
/* select() overwrites readfds/writefds so make a copy. */
setsize = howmany(base->highfd + 1, NFDBITS) * sizeof(fd_mask);
setsize = (size_t)howmany(base->highfd + 1, NFDBITS) * sizeof(fd_mask);
memcpy(base->readfds_out, base->readfds_in, setsize);
memcpy(base->writefds_out, base->writefds_in, setsize);
@ -229,7 +229,7 @@ sudo_ev_scan_impl(struct sudo_event_base *base, unsigned int flags)
/* Activate each I/O event that fired. */
TAILQ_FOREACH(ev, &base->events, entries) {
if (ev->fd >= 0) {
int what = 0;
short what = 0;
if (FD_ISSET(ev->fd, (fd_set *)base->readfds_out))
what |= (ev->events & SUDO_EV_READ);
if (FD_ISSET(ev->fd, (fd_set *)base->writefds_out))
@ -237,7 +237,7 @@ sudo_ev_scan_impl(struct sudo_event_base *base, unsigned int flags)
if (what != 0) {
/* Make event active. */
sudo_debug_printf(SUDO_DEBUG_DEBUG,
"%s: selected fd %d, events %d, activating %p",
"%s: selected fd %d, events %hd, activating %p",
__func__, ev->fd, what, ev);
ev->revents = what;
sudo_ev_activate(base, ev);

View File

@ -61,6 +61,7 @@ sudo_dso_unload_v1
sudo_ev_add_v1
sudo_ev_add_v2
sudo_ev_alloc_v1
sudo_ev_alloc_v2
sudo_ev_base_alloc_v1
sudo_ev_base_free_v1
sudo_ev_base_setdef_v1
@ -76,7 +77,9 @@ sudo_ev_loopbreak_v1
sudo_ev_loopcontinue_v1
sudo_ev_loopexit_v1
sudo_ev_pending_v1
sudo_ev_pending_v2
sudo_ev_set_v1
sudo_ev_set_v2
sudo_fatal_callback_deregister_v1
sudo_fatal_callback_register_v1
sudo_fatal_nodebug_v1