Print this page
NEX-9665 libcfgadm: memory leak in do_list_common()
Reviewed by: Jan Kryl <jan.kryl@nexenta.com>
Reviewed by: Dan Fields <dan.fields@nexenta.com>
NEX-9634 cfgadm_plugins/shp: memory leaks in cfga_list_ext()
Reviewed by: Jan Kryl <jan.kryl@nexenta.com>
Reviewed by: Dan Fields <dan.fields@nexenta.com>
NEX-8148 Alerts should be sent if cores are created on a system (lint fix)
NEX-8148 Alerts should be sent if cores are created on a system
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
        
*** 21,30 ****
--- 21,31 ----
  
  /*
   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
   * Copyright (c) 2011, Joyent Inc. All rights reserved.
   * Copyright (c) 2016 by Delphix. All rights reserved.
+  * Copyright 2017 Nexenta Systems, Inc.
   */
  
  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
  /*        All Rights Reserved   */
  
*** 62,71 ****
--- 63,76 ----
  #include <sys/nbmlock.h>
  #include <sys/stat.h>
  #include <sys/zone.h>
  #include <sys/contract/process_impl.h>
  #include <sys/ddi.h>
+ #include <sys/fm/protocol.h>
+ #include <sys/fm/util.h>
+ #include <sys/fm/sw/core.h>
+ #include <sys/sysevent.h>
  
  /*
   * Processes running within a zone potentially dump core in 3 locations,
   * based on the per-process, per-zone, and the global zone's core settings.
   *
*** 102,111 ****
--- 107,165 ----
                  zcmn_err(zoneid, CE_NOTE, "core_log: %s[%d] %s, errno=%d: %s",
                      fn, pid, why, error, path);
  }
  
  /*
+  * Generate FMA e-report for a core.
+  */
+ static void
+ gen_ereport(const char *path, int sig)
+ {
+         nvlist_t *ereport = NULL;
+         nvlist_t *fmri = NULL;
+         nvlist_t *sw_obj = NULL;
+         uint64_t ena;
+         proc_t *p = curproc;
+         int err = 0;
+ 
+         if ((ereport = fm_nvlist_create(NULL)) == NULL)
+                 return;
+         if ((fmri = fm_nvlist_create(NULL)) == NULL)
+                 goto out;
+         if ((sw_obj = fm_nvlist_create(NULL)) == NULL)
+                 goto out;
+         ena = fm_ena_generate(0, FM_ENA_FMT1);
+ 
+         err |= nvlist_add_uint8(fmri, FM_VERSION, FM_SW_SCHEME_VERSION);
+         err |= nvlist_add_string(fmri, FM_FMRI_SCHEME, FM_FMRI_SCHEME_SW);
+         err |= nvlist_add_string(sw_obj, FM_FMRI_SW_OBJ_PATH, path);
+         err |= nvlist_add_nvlist(fmri, FM_FMRI_SW_OBJ, sw_obj);
+ 
+         if (err != 0)
+                 goto out;
+ 
+         fm_ereport_set(ereport, FM_EREPORT_VERSION, CORE_ERROR_CLASS,
+             ena, fmri, NULL);
+ 
+         fm_payload_set(ereport,
+             FM_EREPORT_PAYLOAD_CORE_COMMAND, DATA_TYPE_STRING,
+             p->p_exec->v_path ? p->p_exec->v_path : p->p_user.u_comm,
+             FM_EREPORT_PAYLOAD_CORE_PSARGS, DATA_TYPE_STRING,
+             p->p_user.u_psargs,
+             FM_EREPORT_PAYLOAD_CORE_SIGNAL, DATA_TYPE_INT32, sig,
+             FM_EREPORT_PAYLOAD_CORE_PATH, DATA_TYPE_STRING, path,
+             NULL);
+ 
+         fm_ereport_post(ereport, EVCH_SLEEP);
+ 
+ out:
+         fm_nvlist_destroy(sw_obj, FM_NVA_FREE);
+         fm_nvlist_destroy(ereport, FM_NVA_FREE);
+         fm_nvlist_destroy(fmri, FM_NVA_FREE);
+ }
+ 
+ /*
   * Private version of vn_remove().
   * Refuse to unlink a directory or an unwritable file.
   * Also allow the process to access files normally inaccessible due to
   * chroot(2) or Zone limitations.
   */
*** 761,770 ****
--- 815,831 ----
                  contract_process_core(p->p_ct_process, p, sig,
                      error1 == 0 ? fp_process : NULL,
                      error2 == 0 ? fp_global : NULL,
                      error3 == 0 ? fp_zone : NULL);
  
+         /*
+          * FMA ereport is currently generated only for global zone cores
+          * with global path.
+          */
+         if (error2 == 0 && global_cg == my_cg)
+                 gen_ereport(fp_global, sig);
+ 
          if (fp_process != NULL)
                  kmem_free(fp_process, MAXPATHLEN);
          if (fp_global != NULL)
                  kmem_free(fp_global, MAXPATHLEN);
          if (fp_zone != NULL)