Print this page
10092 sysevent_evc_control() dereferences pointer before checking for NULL
        
*** 21,30 ****
--- 21,34 ----
  /*
   * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
   */
  
  /*
+  * Copyright (c) 2018, Joyent, Inc.
+  */
+ 
+ /*
   * This file contains the source of the general purpose event channel extension
   * to the sysevent framework. This implementation is made up mainly of four
   * layers of functionality: the event queues (evch_evq_*()), the handling of
   * channels (evch_ch*()), the kernel interface (sysevent_evc_*()) and the
   * interface for the sysevent pseudo driver (evch_usr*()).
*** 1974,1993 ****
  
  int
  sysevent_evc_control(evchan_t *scp, int cmd, ...)
  {
          va_list         ap;
!         evch_chan_t     *chp = ((evch_bind_t *)scp)->bd_channel;
          uint32_t        *chlenp;
          uint32_t        chlen;
          uint32_t        ochlen;
          int             rc = 0;
  
          if (scp == NULL) {
                  return (EINVAL);
          }
  
          va_start(ap, cmd);
          mutex_enter(&chp->ch_mutex);
          switch (cmd) {
          case EVCH_GET_CHAN_LEN:
                  chlenp = va_arg(ap, uint32_t *);
--- 1978,1999 ----
  
  int
  sysevent_evc_control(evchan_t *scp, int cmd, ...)
  {
          va_list         ap;
!         evch_chan_t     *chp;
          uint32_t        *chlenp;
          uint32_t        chlen;
          uint32_t        ochlen;
          int             rc = 0;
  
          if (scp == NULL) {
                  return (EINVAL);
          }
  
+         chp = ((evch_bind_t *)scp)->bd_channel;
+ 
          va_start(ap, cmd);
          mutex_enter(&chp->ch_mutex);
          switch (cmd) {
          case EVCH_GET_CHAN_LEN:
                  chlenp = va_arg(ap, uint32_t *);