* Bug #15213, #18635: The use of the insecure m_scratch() and
[mmh] / uip / mhlsbr.c
index 04da52b..a3ef6ba 100644 (file)
@@ -230,7 +230,7 @@ static int wid;
 
 static char *ovtxt;
 
-static char *onelp;
+static unsigned char *onelp;
 
 static char *parptr;
 
@@ -291,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
@@ -620,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);
@@ -794,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)) {
@@ -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);
 
@@ -1683,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)) {