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

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/mdb/mdb_nv.c
          +++ new/usr/src/cmd/mdb/common/mdb/mdb_nv.c
↓ open down ↓ 15 lines elided ↑ open up ↑
  16   16   * If applicable, add the following below this CDDL HEADER, with the
  17   17   * fields enclosed by brackets "[]" replaced with your own identifying
  18   18   * information: Portions Copyright [yyyy] [name of copyright owner]
  19   19   *
  20   20   * CDDL HEADER END
  21   21   */
  22   22  /*
  23   23   * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26      -
  27      -#pragma ident   "%Z%%M% %I%     %E% SMI"
       26 +/*
       27 + * Copyright (c) 2013 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
       28 + */
  28   29  
  29   30  #include <mdb/mdb_debug.h>
  30   31  #include <mdb/mdb_string.h>
  31   32  #include <mdb/mdb_modapi.h>
  32   33  #include <mdb/mdb_err.h>
  33   34  #include <mdb/mdb_nv.h>
  34   35  #include <mdb/mdb.h>
  35   36  
  36   37  #define NV_NAME(v) \
  37   38          (((v)->v_flags & MDB_NV_EXTNAME) ? (v)->v_ename : (v)->v_lname)
  38   39  
  39   40  #define NV_SIZE(v) \
  40   41          (((v)->v_flags & MDB_NV_EXTNAME) ? sizeof (mdb_var_t) : \
  41      -        sizeof (mdb_var_t) + MDB_NV_NAMELEN - 1)
       42 +        sizeof (mdb_var_t) + strlen((v)->v_lname))
  42   43  
  43   44  #define NV_HASHSZ       211
  44   45  
  45   46  static size_t
  46   47  nv_hashstring(const char *key)
  47   48  {
  48   49          size_t g, h = 0;
  49   50          const char *p;
  50   51  
  51   52          ASSERT(key != NULL);
↓ open down ↓ 7 lines elided ↑ open up ↑
  59   60                  }
  60   61          }
  61   62  
  62   63          return (h);
  63   64  }
  64   65  
  65   66  static mdb_var_t *
  66   67  nv_var_alloc(const char *name, const mdb_nv_disc_t *disc,
  67   68          uintmax_t value, uint_t flags, uint_t um_flags, mdb_var_t *next)
  68   69  {
  69      -        size_t nbytes = (flags & MDB_NV_EXTNAME) ? sizeof (mdb_var_t) :
  70      -            (sizeof (mdb_var_t) + MDB_NV_NAMELEN - 1);
       70 +        size_t nbytes;
       71 +        mdb_var_t *v;
       72 +
       73 +        if (flags & MDB_NV_EXTNAME)
       74 +                nbytes = sizeof (mdb_var_t);
       75 +        else
       76 +                nbytes = sizeof (mdb_var_t) + strlen(name);
  71   77  
  72      -        mdb_var_t *v = mdb_alloc(nbytes, um_flags);
       78 +        v = mdb_alloc(nbytes, um_flags);
  73   79  
  74   80          if (v == NULL)
  75   81                  return (NULL);
  76   82  
  77   83          if (flags & MDB_NV_EXTNAME) {
  78   84                  v->v_ename = name;
  79      -                v->v_lname[0] = 0;
       85 +                v->v_lname[0] = '\0';
  80   86          } else {
  81      -                (void) strncpy(v->v_lname, name, MDB_NV_NAMELEN - 1);
  82      -                v->v_lname[MDB_NV_NAMELEN - 1] = '\0';
       87 +                /*
       88 +                 * We don't overflow here since the mdb_var_t itself has
       89 +                 * room for the trailing \0.
       90 +                 */
       91 +                (void) strcpy(v->v_lname, name);
  83   92                  v->v_ename = NULL;
  84   93          }
  85   94  
  86   95          v->v_uvalue = value;
  87   96          v->v_flags = flags & ~(MDB_NV_SILENT | MDB_NV_INTERPOS);
  88   97          v->v_disc = disc;
  89   98          v->v_next = next;
  90   99  
  91  100          return (v);
  92  101  }
↓ open down ↓ 394 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX