]> granicus.if.org Git - sudo/commitdiff
Add the ability to set a default event base, to be used by plugins
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 13 Jul 2017 19:59:31 +0000 (13:59 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 13 Jul 2017 19:59:31 +0000 (13:59 -0600)
which don't have access to the event base.

include/sudo_event.h
lib/util/event.c
lib/util/util.exp.in
src/exec_monitor.c
src/exec_nopty.c
src/exec_pty.c

index 2e8542a42f25e762a68f9be153ee705001c02409..f3ba5578ba41f69f55386594affbfaa5d81e9919 100644 (file)
@@ -111,6 +111,10 @@ __dso_public struct sudo_event_base *sudo_ev_base_alloc_v1(void);
 __dso_public void sudo_ev_base_free_v1(struct sudo_event_base *base);
 #define sudo_ev_base_free(_a) sudo_ev_base_free_v1((_a))
 
+/* Set the default event base. */
+__dso_public void sudo_ev_base_setdef_v1(struct sudo_event_base *base);
+#define sudo_ev_base_setdef(_a) sudo_ev_base_setdef_v1((_a))
+
 /* Allocate a new event. */
 __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))
index 539c024b72df7ba5792b0d85662be1b5a5471e0c..e62756e6317f5b6cdc299009896c738e268cf9aa 100644 (file)
@@ -44,6 +44,9 @@
 static void sudo_ev_init(struct sudo_event *ev, int fd, short events,
     sudo_ev_callback_t callback, void *closure);
 
+/* Default event base when none is specified. */
+static struct sudo_event_base *default_base;
+
 /* We need the event base to be available from the signal handler. */
 static struct sudo_event_base *signal_base;
 
@@ -237,6 +240,16 @@ sudo_ev_base_free_v1(struct sudo_event_base *base)
     debug_return;
 }
 
+void
+sudo_ev_base_setdef_v1(struct sudo_event_base *base)
+{
+    debug_decl(sudo_ev_base_setdef, SUDO_DEBUG_EVENT)
+
+    default_base = base;
+
+    debug_return;
+}
+
 /*
  * Clear and fill in a struct sudo_event.
  */
@@ -328,7 +341,7 @@ sudo_ev_handler(int signo, siginfo_t *info, void *context)
     }
 }
 
-int
+static int
 sudo_ev_add_signal(struct sudo_event_base *base, struct sudo_event *ev,
     bool tohead)
 {
@@ -416,14 +429,17 @@ sudo_ev_add_v1(struct sudo_event_base *base, struct sudo_event *ev,
 {
     debug_decl(sudo_ev_add, SUDO_DEBUG_EVENT)
 
-    /* If no base specified, use existing one. */
+    /* If no base specified, use existing or default base. */
     if (base == NULL) {
-       if (ev->base == NULL) {
+       if (ev->base != NULL) {
+           base = ev->base;
+       } else if (default_base != NULL) {
+           base = default_base;
+       } else {
            sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: no base specified",
                __func__);
            debug_return_int(-1);
        }
-       base = ev->base;
     }
 
     /* Only add new events to the events list. */
index 3ad4d6e2f744081c61efd9c91fc05c37c9e7ad69..be13bd9db1863e2cb1e908d49b31622365e1effb 100644 (file)
@@ -46,6 +46,7 @@ sudo_ev_add_v1
 sudo_ev_alloc_v1
 sudo_ev_base_alloc_v1
 sudo_ev_base_free_v1
+sudo_ev_base_setdef_v1
 sudo_ev_del_v1
 sudo_ev_free_v1
 sudo_ev_get_timeleft_v1
index b8dc133be051bab6ba32f80f1fa0f02092088303..54e79779148d359f817d85adb8f36b1e31e5dca5 100644 (file)
@@ -486,6 +486,11 @@ fill_exec_closure_monitor(struct monitor_closure *mc,
        sudo_fatal(NULL);
     if (sudo_ev_add(mc->evbase, mc->sigchld_event, NULL, false) == -1)
        sudo_fatal(U_("unable to add event to queue"));
+
+    /* Clear the default event base. */
+    sudo_ev_base_setdef(NULL);
+
+    debug_return;
 }
 
 /*
index c4780dc1ca50e116c9cd304d1b75a23e60863757..400612d5d90e952a273dcdf5a84abfaa5e18eaf9 100644 (file)
@@ -302,6 +302,9 @@ fill_exec_closure_nopty(struct exec_closure_nopty *ec,
        sudo_fatal(U_("unable to add event to queue"));
 #endif
 
+    /* Set the default event base. */
+    sudo_ev_base_setdef(ec->evbase);
+
     debug_return;
 }
 
@@ -313,6 +316,7 @@ free_exec_closure_nopty(struct exec_closure_nopty *ec)
 {
     debug_decl(free_exec_closure_nopty, SUDO_DEBUG_EXEC)
 
+    sudo_ev_base_setdef(NULL);
     sudo_ev_base_free(ec->evbase);
     sudo_ev_free(ec->errpipe_event);
     sudo_ev_free(ec->sigint_event);
index c7cb6430357aeeb7946726b722103f540db858ca..c442419822d9f9e60e645c7a7ab566cf5bc0bf54 100644 (file)
@@ -1103,6 +1103,11 @@ fill_exec_closure_pty(struct exec_closure_pty *ec, struct command_status *cstat,
        SUDO_EV_WRITE, sigfwd_cb, ec);
     if (ec->sigfwd_event == NULL)
        sudo_fatal(NULL);
+
+    /* Set the default event base. */
+    sudo_ev_base_setdef(ec->evbase);
+
+    debug_return;
 }
 
 /*
@@ -1113,6 +1118,7 @@ free_exec_closure_pty(struct exec_closure_pty *ec)
 {
     debug_decl(free_exec_closure_pty, SUDO_DEBUG_EXEC)
 
+    sudo_ev_base_setdef(NULL);
     sudo_ev_base_free(ec->evbase);
     sudo_ev_free(ec->backchannel_event);
     sudo_ev_free(ec->sigint_event);