Print this page
6659 nvlist_free(NULL) is a no-op


 201 
 202         nvl = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
 203         if (nvl && nvlist_dup(nvl, &cnvl, 0) != 0) {
 204                 free(copy);
 205                 return (NULL);
 206         }
 207 
 208         SE_ATTR_PTR(copy) = (uintptr_t)cnvl;
 209         SE_FLAG(copy) = 0;      /* unpacked */
 210         return (copy);
 211 }
 212 
 213 /*
 214  * sysevent_free - Free memory allocated for an event buffer
 215  */
 216 void
 217 sysevent_free(sysevent_t *ev)
 218 {
 219         nvlist_t *attr_list = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
 220 
 221         if (attr_list)
 222                 nvlist_free(attr_list);
 223         free(ev);
 224 }
 225 
 226 /*
 227  * The following routines are used to extract attribute data from a sysevent
 228  * handle.
 229  */
 230 
 231 /*
 232  * sysevent_get_attr_list - allocate and return an attribute associated with
 233  *                      the given sysevent buffer.
 234  */
 235 int
 236 sysevent_get_attr_list(sysevent_t *ev, nvlist_t **nvlist)
 237 {
 238         int error;
 239         caddr_t attr;
 240         size_t attr_len;
 241         uint64_t attr_offset;


1445                                  * Check next nvpair - either subclass or
1446                                  * class
1447                                  */
1448                                 if ((nvpair = nvlist_next_nvpair(nvl, nvpair))
1449                                     == NULL) {
1450                                         new_class = 0;
1451                                         break;
1452                                 } else if (strcmp(nvpair_name(nvpair),
1453                                     CLASS_NAME) == 0) {
1454                                         break;
1455                                 }
1456                         }
1457                 }
1458                 nvlist_free(nvl);
1459         }
1460         return (0);
1461 
1462 create_failed:
1463         dealloc_subscribers(shp);
1464         free_cached_registration(shp);
1465         if (nvl)
1466                 nvlist_free(nvl);
1467         return (-1);
1468 
1469 }
1470 
1471 /*
1472  * cache_update_service - generic event publisher service routine.  This routine
1473  *              is called in response to a registration cache update.
1474  *
1475  */
1476 /*ARGSUSED*/
1477 static void
1478 cache_update_service(void *cookie, char *args, size_t alen,
1479     door_desc_t *ddp, uint_t ndid)
1480 {
1481         int ret = 0;
1482         uint_t num_elem;
1483         char *class, **event_list;
1484         size_t datalen;
1485         uint32_t sub_id;




 201 
 202         nvl = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
 203         if (nvl && nvlist_dup(nvl, &cnvl, 0) != 0) {
 204                 free(copy);
 205                 return (NULL);
 206         }
 207 
 208         SE_ATTR_PTR(copy) = (uintptr_t)cnvl;
 209         SE_FLAG(copy) = 0;      /* unpacked */
 210         return (copy);
 211 }
 212 
 213 /*
 214  * sysevent_free - Free memory allocated for an event buffer
 215  */
 216 void
 217 sysevent_free(sysevent_t *ev)
 218 {
 219         nvlist_t *attr_list = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
 220 

 221         nvlist_free(attr_list);
 222         free(ev);
 223 }
 224 
 225 /*
 226  * The following routines are used to extract attribute data from a sysevent
 227  * handle.
 228  */
 229 
 230 /*
 231  * sysevent_get_attr_list - allocate and return an attribute associated with
 232  *                      the given sysevent buffer.
 233  */
 234 int
 235 sysevent_get_attr_list(sysevent_t *ev, nvlist_t **nvlist)
 236 {
 237         int error;
 238         caddr_t attr;
 239         size_t attr_len;
 240         uint64_t attr_offset;


1444                                  * Check next nvpair - either subclass or
1445                                  * class
1446                                  */
1447                                 if ((nvpair = nvlist_next_nvpair(nvl, nvpair))
1448                                     == NULL) {
1449                                         new_class = 0;
1450                                         break;
1451                                 } else if (strcmp(nvpair_name(nvpair),
1452                                     CLASS_NAME) == 0) {
1453                                         break;
1454                                 }
1455                         }
1456                 }
1457                 nvlist_free(nvl);
1458         }
1459         return (0);
1460 
1461 create_failed:
1462         dealloc_subscribers(shp);
1463         free_cached_registration(shp);

1464         nvlist_free(nvl);
1465         return (-1);
1466 
1467 }
1468 
1469 /*
1470  * cache_update_service - generic event publisher service routine.  This routine
1471  *              is called in response to a registration cache update.
1472  *
1473  */
1474 /*ARGSUSED*/
1475 static void
1476 cache_update_service(void *cookie, char *args, size_t alen,
1477     door_desc_t *ddp, uint_t ndid)
1478 {
1479         int ret = 0;
1480         uint_t num_elem;
1481         char *class, **event_list;
1482         size_t datalen;
1483         uint32_t sub_id;