Print this page
OS-5440 pfexec and the case of the missing error message
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/os/klpd.c
          +++ new/usr/src/uts/common/os/klpd.c
↓ open down ↓ 31 lines elided ↑ open up ↑
  32   32  #include <sys/priv.h>
  33   33  #include <sys/klpd.h>
  34   34  #include <sys/errno.h>
  35   35  #include <sys/kmem.h>
  36   36  #include <sys/project.h>
  37   37  #include <sys/systm.h>
  38   38  #include <sys/sysmacros.h>
  39   39  #include <sys/pathname.h>
  40   40  #include <sys/varargs.h>
  41   41  #include <sys/zone.h>
       42 +#include <sys/cmn_err.h>
       43 +#include <sys/sdt.h>
  42   44  #include <netinet/in.h>
  43   45  
  44   46  #define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1))
  45   47  
  46   48  static kmutex_t klpd_mutex;
  47   49  
  48   50  typedef struct klpd_reg {
  49   51          struct klpd_reg *klpd_next;
  50   52          struct klpd_reg **klpd_refp;
  51   53          door_handle_t   klpd_door;
↓ open down ↓ 801 lines elided ↑ open up ↑
 853  855          priv_set_t *lset;
 854  856          zone_t *myzone = crgetzone(CRED());
 855  857          size_t pasize = PFEXEC_ARG_SIZE(MAXPATHLEN);
 856  858  
 857  859          /* Find registration */
 858  860          mutex_enter(&myzone->zone_lock);
 859  861          if ((pfd = myzone->zone_pfexecd) != NULL)
 860  862                  klpd_hold(pfd);
 861  863          mutex_exit(&myzone->zone_lock);
 862  864  
 863      -        if (pfd == NULL)
      865 +        if (pfd == NULL) {
      866 +                DTRACE_PROBE2(pfexecd__not__running,
      867 +                    zone_t *, myzone, char *, rpnp->pn_path);
      868 +                uprintf("pfexecd not running; pid %d privileges not "
      869 +                    "elevated\n", curproc->p_pid);
 864  870                  return (0);
      871 +        }
 865  872  
 866  873          if (pfd->klpd_door_pid == curproc->p_pid) {
 867  874                  klpd_rele(pfd);
 868  875                  return (0);
 869  876          }
 870  877  
 871  878          pap = kmem_zalloc(pasize, KM_SLEEP);
 872  879  
 873  880          if (get_path(pap->pfa_path, rpnp->pn_path, rpnp->pn_pathlen) == -1)
 874  881                  goto out1;
↓ open down ↓ 14 lines elided ↑ open up ↑
 889  896                  switch (dres) {
 890  897                  case EAGAIN:
 891  898                          delay(1);
 892  899                          continue;
 893  900                  case EINVAL:
 894  901                  case EBADF:
 895  902                          /* FALLTHROUGH */
 896  903                  case EINTR:
 897  904                          /* FALLTHROUGH */
 898  905                  default:
      906 +                        DTRACE_PROBE4(pfexecd__failure,
      907 +                            int, dres, zone_t *, myzone,
      908 +                            char *, rpnp->pn_path, klpd_reg_t *, pfd);
 899  909                          goto out;
 900  910                  }
 901  911          }
 902  912  
 903  913          prp = (pfexec_reply_t *)da.rbuf;
 904  914          /*
 905  915           * Check the size of the result and the alignment of the
 906  916           * privilege sets.
 907  917           */
 908  918          if (da.rsize < sizeof (pr) ||
↓ open down ↓ 239 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX