Print this page
4229 mdb hangs on exit when long umem cache names exist
Reviewed by: Robert Mustacchi <rm@joyent.com>

*** 21,32 **** */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ ! ! #pragma ident "%Z%%M% %I% %E% SMI" #include <mdb/mdb_debug.h> #include <mdb/mdb_string.h> #include <mdb/mdb_modapi.h> #include <mdb/mdb_err.h> --- 21,33 ---- */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ ! /* ! * Copyright (c) 2013 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> ! */ #include <mdb/mdb_debug.h> #include <mdb/mdb_string.h> #include <mdb/mdb_modapi.h> #include <mdb/mdb_err.h>
*** 36,46 **** #define NV_NAME(v) \ (((v)->v_flags & MDB_NV_EXTNAME) ? (v)->v_ename : (v)->v_lname) #define NV_SIZE(v) \ (((v)->v_flags & MDB_NV_EXTNAME) ? sizeof (mdb_var_t) : \ ! sizeof (mdb_var_t) + MDB_NV_NAMELEN - 1) #define NV_HASHSZ 211 static size_t nv_hashstring(const char *key) --- 37,47 ---- #define NV_NAME(v) \ (((v)->v_flags & MDB_NV_EXTNAME) ? (v)->v_ename : (v)->v_lname) #define NV_SIZE(v) \ (((v)->v_flags & MDB_NV_EXTNAME) ? sizeof (mdb_var_t) : \ ! sizeof (mdb_var_t) + strlen((v)->v_lname)) #define NV_HASHSZ 211 static size_t nv_hashstring(const char *key)
*** 64,87 **** static mdb_var_t * nv_var_alloc(const char *name, const mdb_nv_disc_t *disc, uintmax_t value, uint_t flags, uint_t um_flags, mdb_var_t *next) { ! size_t nbytes = (flags & MDB_NV_EXTNAME) ? sizeof (mdb_var_t) : ! (sizeof (mdb_var_t) + MDB_NV_NAMELEN - 1); ! mdb_var_t *v = mdb_alloc(nbytes, um_flags); if (v == NULL) return (NULL); if (flags & MDB_NV_EXTNAME) { v->v_ename = name; ! v->v_lname[0] = 0; } else { ! (void) strncpy(v->v_lname, name, MDB_NV_NAMELEN - 1); ! v->v_lname[MDB_NV_NAMELEN - 1] = '\0'; v->v_ename = NULL; } v->v_uvalue = value; v->v_flags = flags & ~(MDB_NV_SILENT | MDB_NV_INTERPOS); --- 65,96 ---- static mdb_var_t * nv_var_alloc(const char *name, const mdb_nv_disc_t *disc, uintmax_t value, uint_t flags, uint_t um_flags, mdb_var_t *next) { ! size_t nbytes; ! mdb_var_t *v; ! if (flags & MDB_NV_EXTNAME) ! nbytes = sizeof (mdb_var_t); ! else ! nbytes = sizeof (mdb_var_t) + strlen(name); ! ! v = mdb_alloc(nbytes, um_flags); if (v == NULL) return (NULL); if (flags & MDB_NV_EXTNAME) { v->v_ename = name; ! v->v_lname[0] = '\0'; } else { ! /* ! * We don't overflow here since the mdb_var_t itself has ! * room for the trailing \0. ! */ ! (void) strcpy(v->v_lname, name); v->v_ename = NULL; } v->v_uvalue = value; v->v_flags = flags & ~(MDB_NV_SILENT | MDB_NV_INTERPOS);