Author: alfred
Date: Fri Apr 30 03:15:00 2010
New Revision: 207418
URL: http://svn.freebsd.org/changeset/base/207418

Log:
  Avoid allocating MAXHOSTNAMELEN bytes on the stack in expand_name(),
  use the heap instead.
  
  Obtained from: Juniper Networks
  
  Reviewed by:  jhb

Modified:
  head/sys/kern/kern_sig.c

Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c    Fri Apr 30 03:14:47 2010        (r207417)
+++ head/sys/kern/kern_sig.c    Fri Apr 30 03:15:00 2010        (r207418)
@@ -3004,8 +3004,9 @@ expand_name(const char *name, uid_t uid,
        char *temp;
        size_t i;
        int indexpos;
-       char hostname[MAXHOSTNAMELEN];
+       char *hostname;
        
+       hostname = NULL;
        format = corefilename;
        temp = malloc(MAXPATHLEN, M_TEMP, M_NOWAIT | M_ZERO);
        if (temp == NULL)
@@ -3021,8 +3022,21 @@ expand_name(const char *name, uid_t uid,
                                sbuf_putc(&sb, '%');
                                break;
                        case 'H':       /* hostname */
+                               if (hostname == NULL) {
+                                       hostname = malloc(MAXHOSTNAMELEN,
+                                           M_TEMP, M_NOWAIT);
+                                       if (hostname == NULL) {
+                                               log(LOG_ERR,
+                                                   "pid %ld (%s), uid (%lu): "
+                                                   "unable to alloc memory "
+                                                   "for corefile hostname\n",
+                                                   (long)pid, name,
+                                                   (u_long)uid);
+                                                goto nomem;
+                                        }
+                                }
                                getcredhostname(td->td_ucred, hostname,
-                                   sizeof(hostname));
+                                   MAXHOSTNAMELEN);
                                sbuf_printf(&sb, "%s", hostname);
                                break;
                        case 'I':       /* autoincrementing index */
@@ -3048,15 +3062,17 @@ expand_name(const char *name, uid_t uid,
                        sbuf_putc(&sb, format[i]);
                }
        }
+       free(hostname, M_TEMP);
 #ifdef COMPRESS_USER_CORES
        if (compress) {
                sbuf_printf(&sb, GZ_SUFFIX);
        }
 #endif
        if (sbuf_overflowed(&sb)) {
-               sbuf_delete(&sb);
                log(LOG_ERR, "pid %ld (%s), uid (%lu): corename is too "
                    "long\n", (long)pid, name, (u_long)uid);
+nomem:
+               sbuf_delete(&sb);
                free(temp, M_TEMP);
                return (NULL);
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to