The following reply was made to PR kern/176373; it has been noted by GNATS.

From: dfil...@freebsd.org (dfilter service)
To: bug-follo...@freebsd.org
Cc:  
Subject: Re: kern/176373: commit references a PR
Date: Fri,  8 Mar 2013 11:26:00 +0000 (UTC)

 Author: marius
 Date: Fri Mar  8 11:25:52 2013
 New Revision: 248034
 URL: http://svnweb.freebsd.org/changeset/base/248034
 
 Log:
   MFC: r247561
   
   - Use strdup(9) instead of reimplementing it.
   - Use __DECONST instead of strange casts.
   - Reduce code duplication and simplify name2oid().
   
   PR:          176373
   Submitted by:        Christoph Mallon
 
 Modified:
   stable/9/sys/kern/kern_sysctl.c
 Directory Properties:
   stable/9/sys/   (props changed)
 
 Modified: stable/9/sys/kern/kern_sysctl.c
 ==============================================================================
 --- stable/9/sys/kern/kern_sysctl.c    Fri Mar  8 10:43:03 2013        
(r248033)
 +++ stable/9/sys/kern/kern_sysctl.c    Fri Mar  8 11:25:52 2013        
(r248034)
 @@ -444,9 +444,9 @@ sysctl_remove_oid_locked(struct sysctl_o
                                SYSCTL_SLEEP(&oidp->oid_running, "oidrm", 0);
                        }
                        if (oidp->oid_descr)
 -                              free((void *)(uintptr_t)(const void 
*)oidp->oid_descr, M_SYSCTLOID);
 -                      free((void *)(uintptr_t)(const void *)oidp->oid_name,
 -                           M_SYSCTLOID);
 +                              free(__DECONST(char *, oidp->oid_descr),
 +                                  M_SYSCTLOID);
 +                      free(__DECONST(char *, oidp->oid_name), M_SYSCTLOID);
                        free(oidp, M_SYSCTLOID);
                }
        }
 @@ -462,8 +462,6 @@ sysctl_add_oid(struct sysctl_ctx_list *c
        int (*handler)(SYSCTL_HANDLER_ARGS), const char *fmt, const char *descr)
  {
        struct sysctl_oid *oidp;
 -      ssize_t len;
 -      char *newname;
  
        /* You have to hook up somewhere.. */
        if (parent == NULL)
 @@ -490,11 +488,7 @@ sysctl_add_oid(struct sysctl_ctx_list *c
        SLIST_NEXT(oidp, oid_link) = NULL;
        oidp->oid_number = number;
        oidp->oid_refcnt = 1;
 -      len = strlen(name);
 -      newname = malloc(len + 1, M_SYSCTLOID, M_WAITOK);
 -      bcopy(name, newname, len + 1);
 -      newname[len] = '\0';
 -      oidp->oid_name = newname;
 +      oidp->oid_name = strdup(name, M_SYSCTLOID);
        oidp->oid_handler = handler;
        oidp->oid_kind = CTLFLAG_DYN | kind;
        if ((kind & CTLTYPE) == CTLTYPE_NODE) {
 @@ -508,12 +502,8 @@ sysctl_add_oid(struct sysctl_ctx_list *c
                oidp->oid_arg2 = arg2;
        }
        oidp->oid_fmt = fmt;
 -      if (descr) {
 -              int len = strlen(descr) + 1;
 -              oidp->oid_descr = malloc(len, M_SYSCTLOID, M_WAITOK);
 -              if (oidp->oid_descr)
 -                      strcpy((char *)(uintptr_t)(const void 
*)oidp->oid_descr, descr);
 -      }
 +      if (descr)
 +              oidp->oid_descr = strdup(descr, M_SYSCTLOID);
        /* Update the context, if used */
        if (clist != NULL)
                sysctl_ctx_entry_add(clist, oidp);
 @@ -529,16 +519,12 @@ sysctl_add_oid(struct sysctl_ctx_list *c
  void
  sysctl_rename_oid(struct sysctl_oid *oidp, const char *name)
  {
 -      ssize_t len;
        char *newname;
 -      void *oldname;
 +      char *oldname;
  
 -      len = strlen(name);
 -      newname = malloc(len + 1, M_SYSCTLOID, M_WAITOK);
 -      bcopy(name, newname, len + 1);
 -      newname[len] = '\0';
 +      newname = strdup(name, M_SYSCTLOID);
        SYSCTL_XLOCK();
 -      oldname = (void *)(uintptr_t)(const void *)oidp->oid_name;
 +      oldname = __DECONST(char *, oidp->oid_name);
        oidp->oid_name = newname;
        SYSCTL_XUNLOCK();
        free(oldname, M_SYSCTLOID);
 @@ -823,39 +809,26 @@ static SYSCTL_NODE(_sysctl, 2, next, CTL
  static int
  name2oid(char *name, int *oid, int *len, struct sysctl_oid **oidpp)
  {
 -      int i;
        struct sysctl_oid *oidp;
        struct sysctl_oid_list *lsp = &sysctl__children;
        char *p;
  
        SYSCTL_ASSERT_XLOCKED();
  
 -      if (!*name)
 -              return (ENOENT);
 +      for (*len = 0; *len < CTL_MAXNAME;) {
 +              p = strsep(&name, ".");
  
 -      p = name + strlen(name) - 1 ;
 -      if (*p == '.')
 -              *p = '\0';
 -
 -      *len = 0;
 -
 -      for (p = name; *p && *p != '.'; p++) 
 -              ;
 -      i = *p;
 -      if (i == '.')
 -              *p = '\0';
 -
 -      oidp = SLIST_FIRST(lsp);
 -
 -      while (oidp && *len < CTL_MAXNAME) {
 -              if (strcmp(name, oidp->oid_name)) {
 -                      oidp = SLIST_NEXT(oidp, oid_link);
 -                      continue;
 +              oidp = SLIST_FIRST(lsp);
 +              for (;; oidp = SLIST_NEXT(oidp, oid_link)) {
 +                      if (oidp == NULL)
 +                              return (ENOENT);
 +                      if (strcmp(p, oidp->oid_name) == 0)
 +                              break;
                }
                *oid++ = oidp->oid_number;
                (*len)++;
  
 -              if (!i) {
 +              if (name == NULL || *name == '\0') {
                        if (oidpp)
                                *oidpp = oidp;
                        return (0);
 @@ -868,13 +841,6 @@ name2oid(char *name, int *oid, int *len,
                        break;
  
                lsp = SYSCTL_CHILDREN(oidp);
 -              oidp = SLIST_FIRST(lsp);
 -              name = p+1;
 -              for (p = name; *p && *p != '.'; p++) 
 -                              ;
 -              i = *p;
 -              if (i == '.')
 -                      *p = '\0';
        }
        return (ENOENT);
  }
 _______________________________________________
 svn-src-...@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"
 
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to