Print this page
Rich's feedback

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/mdb/mdb_demangle.c
          +++ new/usr/src/cmd/mdb/common/mdb/mdb_demangle.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 2001-2002 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   *
  26      - * Copyright 2017 Jason King
       26 + * Copyright 2018 Jason King
  27   27   */
  28   28  
  29   29  #include <mdb/mdb_modapi.h>
  30   30  #include <mdb/mdb_demangle.h>
  31   31  #include <mdb/mdb_err.h>
  32   32  #include <mdb/mdb.h>
  33   33  
  34      -#include <demangle.h>
  35   34  #include <strings.h>
  36   35  #include <unistd.h>
  37   36  #include <dlfcn.h>
  38   37  #include <link.h>
  39      -#include <sysdemangle.h>
  40   38  
  41   39  static void *
  42   40  mdb_dem_alloc(size_t len)
  43   41  {
  44   42          return (mdb_alloc(len, UM_SLEEP));
  45   43  }
  46   44  
  47   45  static void
  48   46  mdb_dem_free(void *p, size_t len)
  49   47  {
↓ open down ↓ 151 lines elided ↑ open up ↑
 201  199  
 202  200          char *prefix = strrchr(name, '`');
 203  201          size_t prefixlen = 0;
 204  202  
 205  203          if (prefix) {
 206  204                  prefix++;               /* the ` is part of the prefix */
 207  205                  prefixlen = prefix - name;
 208  206          }
 209  207  
 210  208          res = sysdemangle(name + prefixlen, dmp->dm_lang, &mdb_dem_demops);
 211      -        if (res == NULL && errno != EINVAL)
 212      -                mdb_warn("Error while demangling");
      209 +        if (res == NULL) {
      210 +                if (errno != EINVAL)
      211 +                        mdb_warn("Error while demangling");
      212 +                return (-1);
      213 +        }
 213  214  
 214  215          reslen = (res != NULL) ? strlen(res) : 0;
 215  216          reslen += prefixlen;
 216  217          reslen += 1;
 217  218  
 218  219          if (reslen > dmp->dm_len) {
 219  220                  mdb_free(dmp->dm_buf, dmp->dm_len);
 220  221  
 221  222                  dmp->dm_buf = mdb_zalloc(reslen, UM_SLEEP);
 222  223                  if (dmp->dm_buf == NULL) {
 223  224                          dmp->dm_len = 0;
 224  225                          mdb_warn("Unable to allocate memory for demangling");
 225  226                          return (-1);
 226  227                  }
 227  228                  dmp->dm_len = reslen;
 228  229          }
 229  230  
 230  231          if (prefixlen > 0)
 231  232                  (void) strlcpy(dmp->dm_buf, name, prefixlen);
 232      -        if (res != NULL)
      233 +
      234 +        if (res != NULL) {
 233  235                  (void) strlcat(dmp->dm_buf, res, dmp->dm_len);
      236 +                mdb_dem_free(res, strlen(res) + 1);
      237 +        }
 234  238  
 235  239          /*
 236  240           * Save the position of the demangled string for mdb_dem_filter()
 237  241           */
 238  242          dmp->dm_dem = dmp->dm_buf + prefixlen;
 239  243  
 240  244          return (0);
 241  245  }
 242  246  
 243  247  /* used by mdb_io.c:iob_addr2str */
↓ open down ↓ 89 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX