* Bug #15213, #18635: The use of the insecure m_scratch() and
[mmh] / uip / mhlsbr.c
index c310e2a..a3ef6ba 100644 (file)
@@ -14,6 +14,7 @@
 #include <h/addrsbr.h>
 #include <h/fmt_scan.h>
 #include <h/tws.h>
+#include <h/utils.h>
 #include <setjmp.h>
 #include <signal.h>
 
@@ -229,7 +230,7 @@ static int wid;
 
 static char *ovtxt;
 
-static char *onelp;
+static unsigned char *onelp;
 
 static char *parptr;
 
@@ -290,7 +291,6 @@ int SOprintf (char *, ...);           /* from termsbr.c */
 int sc_width (void);                  /* from termsbr.c */
 int sc_length (void);                 /* from termsbr.c */
 int sc_hardcopy (void);               /* from termsbr.c */
-struct hostent *gethostbystring ();
 
 
 int
@@ -562,7 +562,7 @@ mhl_format (char *file, int length, int width)
                 * Split this list of fields to ignore, and copy
                 * it to the end of the current "ignores" list.
                 */
-               if (!strcasecmp (name, "ignores")) {
+               if (!mh_strcasecmp (name, "ignores")) {
                    char **tmparray, **p;
                    int n = 0;
 
@@ -619,7 +619,8 @@ mhl_format (char *file, int length, int width)
            fprintf (stderr, "c1: name=\"%s\" text=\"%s\" ovtxt=\"%s\"\n",
                    c1->c_name, c1->c_text, c1->c_ovtxt);
            fprintf (stderr, "\tnfs=0x%x fmt=0x%x\n",
-                   (unsigned int) c1->c_nfs, (unsigned int) c1->c_fmt);
+                    (unsigned int)(unsigned long) c1->c_nfs,
+                    (unsigned int)(unsigned long) c1->c_fmt);
            fprintf (stderr, "\toffset=%d ovoff=%d width=%d cwidth=%d length=%d\n",
                    c1->c_offset, c1->c_ovoff, c1->c_width,
                    c1->c_cwidth, c1->c_length);
@@ -666,17 +667,17 @@ evalvar (struct mcomp *c1)
        return 0;
     strncpy (name, parse(), sizeof(name));
 
-    if (!strcasecmp (name, "component")) {
+    if (!mh_strcasecmp (name, "component")) {
        if (ptos (name, &c1->c_text))
            return 1;
        c1->c_flags &= ~NOCOMPONENT;
        return 0;
     }
 
-    if (!strcasecmp (name, "overflowtext"))
+    if (!mh_strcasecmp (name, "overflowtext"))
        return ptos (name, &c1->c_ovtxt);
 
-    if (!strcasecmp (name, "formatfield")) {
+    if (!mh_strcasecmp (name, "formatfield")) {
        char *nfs;
 
        if (ptos (name, &cp))
@@ -687,7 +688,7 @@ evalvar (struct mcomp *c1)
        return 0;
     }
 
-    if (!strcasecmp (name, "decode")) {
+    if (!mh_strcasecmp (name, "decode")) {
        char *nfs;
 
        nfs = new_fs (NULL, NULL, "%(decode{text})");
@@ -696,21 +697,21 @@ evalvar (struct mcomp *c1)
        return 0;
     }
 
-    if (!strcasecmp (name, "offset"))
+    if (!mh_strcasecmp (name, "offset"))
        return ptoi (name, &c1->c_offset);
-    if (!strcasecmp (name, "overflowoffset"))
+    if (!mh_strcasecmp (name, "overflowoffset"))
        return ptoi (name, &c1->c_ovoff);
-    if (!strcasecmp (name, "width"))
+    if (!mh_strcasecmp (name, "width"))
        return ptoi (name, &c1->c_width);
-    if (!strcasecmp (name, "compwidth"))
+    if (!mh_strcasecmp (name, "compwidth"))
        return ptoi (name, &c1->c_cwidth);
-    if (!strcasecmp (name, "length"))
+    if (!mh_strcasecmp (name, "length"))
        return ptoi (name, &c1->c_length);
-    if (!strcasecmp (name, "nodashstuffing"))
+    if (!mh_strcasecmp (name, "nodashstuffing"))
        return (dashstuff = -1);
 
     for (ap = triples; ap->t_name; ap++)
-       if (!strcasecmp (ap->t_name, name)) {
+       if (!mh_strcasecmp (ap->t_name, name)) {
            c1->c_flags |= ap->t_on;
            c1->c_flags &= ~ap->t_off;
            return 0;
@@ -793,8 +794,8 @@ parse (void)
 static void
 process (char *folder, char *fname, int ofilen, int ofilec)
 {
-    char *cp;
-    FILE *fp;
+    char *cp = NULL;
+    FILE *fp = NULL;
     struct mcomp *c1;
 
     switch (setjmp (env)) {
@@ -903,7 +904,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
            case FLD: 
            case FLDPLUS: 
                for (ip = ignores; *ip; ip++)
-                   if (!strcasecmp (name, *ip)) {
+                   if (!mh_strcasecmp (name, *ip)) {
                        while (state == FLDPLUS)
                            state = m_getfld (state, name, buf, sizeof(buf), fp);
                        break;
@@ -912,12 +913,12 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                    continue;
 
                for (c2 = fmthd; c2; c2 = c2->c_next)
-                   if (!strcasecmp (c2->c_name, name))
+                   if (!mh_strcasecmp (c2->c_name, name))
                        break;
                c1 = NULL;
                if (!((c3 = c2 ? c2 : &global)->c_flags & SPLIT))
                    for (c1 = msghd; c1; c1 = c1->c_next)
-                       if (!strcasecmp (c1->c_name, c3->c_name)) {
+                       if (!mh_strcasecmp (c1->c_name, c3->c_name)) {
                            c1->c_text =
                                mcomp_add (c1->c_flags, buf, c1->c_text);
                            break;
@@ -940,7 +941,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                        putcomp (c1, c1, ONECOMP);
                        continue;
                    }
-                   if (!strcasecmp (c1->c_name, "messagename")) {
+                   if (!mh_strcasecmp (c1->c_name, "messagename")) {
                        holder.c_text = concat ("(Message ", mname, ")\n",
                                            NULL);
                        putcomp (c1, &holder, ONECOMP);
@@ -948,15 +949,14 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                        holder.c_text = NULL;
                        continue;
                    }
-                   if (!strcasecmp (c1->c_name, "extras")) {
+                   if (!mh_strcasecmp (c1->c_name, "extras")) {
                        for (c2 = msghd; c2; c2 = c2->c_next)
                            if (c2->c_flags & EXTRA)
                                putcomp (c1, c2, TWOCOMP);
                        continue;
                    }
-                   if (dobody && !strcasecmp (c1->c_name, "body")) {
-                       if ((holder.c_text = malloc (sizeof(buf))) == NULL)
-                           adios (NULL, "unable to allocate buffer memory");
+                   if (dobody && !mh_strcasecmp (c1->c_name, "body")) {
+                       holder.c_text = mh_xmalloc (sizeof(buf));
                        strncpy (holder.c_text, buf, sizeof(buf));
                        while (state == BODY) {
                            putcomp (c1, &holder, BODYCOMP);
@@ -968,7 +968,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                        continue;
                    }
                    for (c2 = msghd; c2; c2 = c2->c_next)
-                       if (!strcasecmp (c2->c_name, c1->c_name)) {
+                       if (!mh_strcasecmp (c2->c_name, c1->c_name)) {
                            putcomp (c1, c2, ONECOMP);
                            if (!(c1->c_flags & SPLIT))
                                break;
@@ -1006,7 +1006,7 @@ mcomp_flags (char *name)
     struct pair *ap;
 
     for (ap = pairs; ap->p_name; ap++)
-       if (!strcasecmp (ap->p_name, name))
+       if (!mh_strcasecmp (ap->p_name, name))
            return (ap->p_flags);
 
     return 0;
@@ -1185,7 +1185,7 @@ static void
 putcomp (struct mcomp *c1, struct mcomp *c2, int flag)
 {
     int count, cchdr;
-    char *cp;
+    unsigned char *cp;
 
     cchdr = 0;
     lm = 0;
@@ -1298,6 +1298,8 @@ putcomp (struct mcomp *c1, struct mcomp *c2, int flag)
        if (term == '\n')
            putstr ("\n");
     }
+    if (flag == BODYCOMP && term == '\n')
+       c1->c_flags &= ~HDROUTPUT;              /* Buffer ended on a newline */
 }
 
 
@@ -1524,17 +1526,16 @@ static int
 doface (struct mcomp *c1)
 {
     int        result, sd;
-    struct sockaddr_in in_socket;
-    struct sockaddr_in *isock = &in_socket;
     static int inited = OK;
-    static int addrlen;
-    static struct in_addr addr;
-    static unsigned short portno;
+    static struct sockaddr_storage ss;
+    static socklen_t socklen;
+    static int socktype;
+    static int protocol;
 
     if (inited == OK) {
        char *cp;
        char **ap = brkstring (cp = getcpy (faceproc), " ", "\n");
-       struct hostent *hp;
+       struct addrinfo hints, *res;
 
        if (ap[0] == NULL || ap[1] == NULL) {
 bad_faceproc: ;
@@ -1542,27 +1543,30 @@ bad_faceproc: ;
            return (inited = NOTOK);
        }
 
-       if (!(hp = gethostbystring (ap[0])))
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_flags = AI_ADDRCONFIG;
+       hints.ai_family = PF_UNSPEC;
+       hints.ai_socktype = SOCK_DGRAM;
+
+       if (getaddrinfo(ap[0], ap[1], &hints, &res) != 0)
            goto bad_faceproc;
-       memcpy((char *) &addr, hp->h_addr, addrlen = hp->h_length);
 
-       portno = htons ((unsigned short) atoi (ap[1]));
-       free (cp);
+       memcpy(&ss, res->ai_addr, res->ai_addrlen);
+       socklen = res->ai_addrlen;
+       socktype = res->ai_socktype;
+       protocol = res->ai_protocol;
+       freeaddrinfo(res);
 
        inited = DONE;
     }
     if (inited == NOTOK)
        return NOTOK;
 
-    isock->sin_family = AF_INET;
-    isock->sin_port = portno;
-    memcpy((char *) &isock->sin_addr, (char *) &addr, addrlen);
-
-    if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == NOTOK)
+    if ((sd = socket (ss.ss_family, socktype, protocol)) == NOTOK)
        return NOTOK;
 
     result = sendto (sd, c1->c_text, strlen (c1->c_text), 0,
-               (struct sockaddr *) isock, sizeof(*isock));
+               (struct sockaddr *) &ss, socklen);
 
     close (sd);
 
@@ -1644,14 +1648,12 @@ doface (struct mcomp *c1)
                if (cp) {
                    int j;
                    char *dp;
-                   if ((dp = realloc (cp, (unsigned) (j = len + i))) == NULL)
-                       adios (NULL, "unable to allocate face storage");
+                   dp = mh_xrealloc (cp, (unsigned) (j = len + i));
                    memcpy(dp + len, buffer, i);
                    cp = dp, len = j;
                }
                else {
-                   if ((cp = malloc ((unsigned) i)) == NULL)
-                       adios (NULL, "unable to allocate face storage");
+                   cp = mh_xmalloc ((unsigned) i);
                    memcpy(cp, buffer, i);
                    len = i;
                }
@@ -1685,8 +1687,8 @@ doface (struct mcomp *c1)
 int
 mhlsbr (int argc, char **argv, FILE *(*action)())
 {
-    SIGNAL_HANDLER istat, pstat, qstat;
-    char *cp;
+    SIGNAL_HANDLER istat = NULL, pstat = NULL, qstat = NULL;
+    char *cp = NULL;
     struct mcomp *c1;
 
     switch (setjmp (mhlenv)) {