Move freeaddrinfo() to inside of our loop; this prevents a memory leak
[mmh] / sbr / mts.c
index 169894f..de7518c 100644 (file)
--- a/sbr/mts.c
+++ b/sbr/mts.c
@@ -11,6 +11,7 @@
 
 #include <h/mh.h>   /* for snprintf() */
 #include <h/nmh.h>
+#include <h/utils.h>
 
 #define nmhetcdir(file) NMHETCDIR#file
 
@@ -30,7 +31,7 @@
 /*
  * static prototypes
  */
-static char *tailor_value (char *);
+static char *tailor_value (unsigned char *);
 static void getuserinfo (void);
 
 /*
@@ -171,7 +172,8 @@ static struct bind binds[] = {
 void
 mts_init (char *name)
 {
-    char *bp, *cp, buffer[BUFSIZ];
+    unsigned char *bp;
+    char *cp, buffer[BUFSIZ];
     struct bind *b;
     FILE *fp;
     static int inited = 0;
@@ -232,7 +234,7 @@ mts_init (char *name)
  */
 
 static char *
-tailor_value (char *s)
+tailor_value (unsigned char *s)
 {
     int i, r;
     char *bp;
@@ -271,8 +273,8 @@ tailor_value (char *s)
     *bp = 0;
 
     len = strlen (buffer) + 1;
-    if ((bp = malloc (len)))
-       memcpy (bp, buffer, len);
+    bp = mh_xmalloc (len);
+    memcpy (bp, buffer, len);
 
     return bp;
 }
@@ -285,8 +287,7 @@ char *
 LocalName (void)
 {
     static char buffer[BUFSIZ] = "";
-    struct hostent *hp;
-
+    struct addrinfo hints, *res;
 #ifdef HAVE_UNAME
     struct utsname name;
 #endif
@@ -301,20 +302,24 @@ LocalName (void)
     if (*localname) {
        strncpy (buffer, localname, sizeof(buffer));
     } else {
+       memset(buffer, 0, sizeof(buffer));
 #ifdef HAVE_UNAME
        /* first get our local name */
        uname (&name);
-       strncpy (buffer, name.nodename, sizeof(buffer));
+       strncpy (buffer, name.nodename, sizeof(buffer) - 1);
 #else
        /* first get our local name */
-       gethostname (buffer, sizeof(buffer));
+       gethostname (buffer, sizeof(buffer) - 1);
 #endif
-#ifdef HAVE_SETHOSTENT
-       sethostent (1);
-#endif 
        /* now fully qualify our name */
-       if ((hp = gethostbyname (buffer)))
-           strncpy (buffer, hp->h_name, sizeof(buffer));
+
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_flags = AI_CANONNAME;
+       hints.ai_family = PF_UNSPEC;
+       if (getaddrinfo(buffer, NULL, &hints, &res) == 0) {
+           strncpy(buffer, res->ai_canonname, sizeof(buffer) - 1);
+           freeaddrinfo(res);
+       }
     }
 
     /*
@@ -405,7 +410,8 @@ getfullname (void)
 static void
 getuserinfo (void)
 {
-    register char *cp, *np;
+    register unsigned char *cp;
+    register char *np;
     register struct passwd *pw;
 
 #ifdef KPOP