Vanilla Development Maling List Archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

CVS update: Vanilla/ntserv



Date:	Tuesday March 23, 1999 @ 21:45
Author:	cameron

Update of /home/netrek/cvsroot/Vanilla/ntserv
In directory cvs.castle.real-time.com:/var/tmp/cvs-serv2609/ntserv

Modified Files:
	solicit.c 
Log Message:
fix stack mangling caused by packet overrun

****************************************

Index: Vanilla/ntserv/solicit.c
diff -u Vanilla/ntserv/solicit.c:1.1.1.1 Vanilla/ntserv/solicit.c:1.2
--- Vanilla/ntserv/solicit.c:1.1.1.1	Wed Nov 11 20:44:53 1998
+++ Vanilla/ntserv/solicit.c	Tue Mar 23 21:45:58 1999
@@ -22,27 +22,27 @@
 #define META_MAXIMUM_DELAY 900
 
 /* ship classes (wish these were in data.c/data.h) */
-static char *ships[] = {"SC", "DD", "CA", "BB", "AS", "SB", "GA"};
+/* static char *ships[] = {"SC", "DD", "CA", "BB", "AS", "SB", "GA"}; */
 
 /* structure of information about a single metaserver */
 struct metaserver
 {
-    /* data items derived from metaservers file */
-    char host[32];		/* address of metaserver (DNS)		*/
-    int port;			/* port of metaserver			*/
-    int minimum;		/* minimum update time			*/
-    int maximum;		/* maximum update time			*/
-    char ours[32];		/* DNS address of server 	 	*/
-    char type[2];		/* server type code (B/P/C/H/?)		*/
-    int pport;			/* server main player port (e.g. 2592)	*/
-    int oport;			/* server observer player port		*/
-    char comment[32];		/* comment string			*/
-
-    /* our own data about the communication with the metaserver */
-    int sock;                   /* our socket number                    */
-    struct sockaddr_in address;	/* address of metaserver		*/
-    time_t sent;		/* date time metaserver last updated	*/
-    char prior[MAXMETABYTES];	/* prior packet sent			*/
+  /* data items derived from metaservers file */
+  char host[32];		/* address of metaserver (DNS)		*/
+  int port;			/* port of metaserver			*/
+  int minimum;			/* minimum update time			*/
+  int maximum;			/* maximum update time			*/
+  char ours[32];		/* DNS address of server 	 	*/
+  char type[2];			/* server type code (B/P/C/H/?)		*/
+  int pport;			/* server main player port (e.g. 2592)	*/
+  int oport;			/* server observer player port		*/
+  char comment[32];		/* comment string			*/
+  
+  /* our own data about the communication with the metaserver */
+  int sock;			/* our socket number                    */
+  struct sockaddr_in address;	/* address of metaserver		*/
+  time_t sent;			/* date time metaserver last updated	*/
+  char prior[MAXMETABYTES];	/* prior packet sent			*/
 } metaservers[MAXMETASERVERS];
 
 /* initialisation done flag */
@@ -51,157 +51,155 @@
 /* attach to a metaserver, i.e. prepare the socket */
 static int udp_attach(struct metaserver *m)
 {
-    /* create the socket structure */
-    m->sock = socket(AF_INET, SOCK_DGRAM, 0);
-    if (m->sock < 0) {
-        perror("solicit: udp_attach: socket");
-        return 0;
-    }
-
-    /* bind the local socket */
-    m->address.sin_addr.s_addr = INADDR_ANY;
-    m->address.sin_family      = AF_INET;
-    m->address.sin_port        = 0;
-    if (bind(m->sock,(struct sockaddr *)&m->address, sizeof(m->address)) < 0) {
-        perror("solicit: udp_attach: bind");
-        return 0;
-    }
+  /* create the socket structure */
+  m->sock = socket(AF_INET, SOCK_DGRAM, 0);
+  if (m->sock < 0) {
+    perror("solicit: udp_attach: socket");
+    return 0;
+  }
+  
+  /* bind the local socket */
+  m->address.sin_addr.s_addr = INADDR_ANY;
+  m->address.sin_family      = AF_INET;
+  m->address.sin_port        = 0;
+  if (bind(m->sock,(struct sockaddr *)&m->address, sizeof(m->address)) < 0) {
+    perror("solicit: udp_attach: bind");
+    return 0;
+  }
+  
+  /* build the destination address */
+  m->address.sin_family = AF_INET;
+  m->address.sin_port = htons(m->port);
+  
+  /* attempt numeric translation first */
+  if ((m->address.sin_addr.s_addr = inet_addr(m->host)) == -1) {
+    struct hostent *hp;
     
-    /* build the destination address */
-    m->address.sin_family = AF_INET;
-    m->address.sin_port = htons(m->port);
-
-    /* attempt numeric translation first */
-    if ((m->address.sin_addr.s_addr = inet_addr(m->host)) == -1)
-    {
-        struct hostent *hp;
-        
-        /* then translation by name */
-        if ((hp = gethostbyname(m->host)) == NULL)
-        {
-            /* if it didn't work, return failure and warning */
-            fprintf(stderr, "solicit: udp_attach: host %s not known\n", 
-		m->host);
-            return 0;
-        }
-        else
-        {
-            m->address.sin_addr.s_addr = *(long *) hp->h_addr;
-        }
-    }
-
-    return 1;
+    /* then translation by name */
+    if ((hp = gethostbyname(m->host)) == NULL) {
+      /* if it didn't work, return failure and warning */
+      fprintf(stderr, "solicit: udp_attach: host %s not known\n", 
+	      m->host);
+      return 0;
+    } else {
+      m->address.sin_addr.s_addr = *(long *) hp->h_addr;
+    }
+  }
+  
+  return 1;
 }
 
 /* transmit a packet to the metaserver */
 static int udp_tx(struct metaserver *m, char *buffer, int length)
 {
-    /* send the packet */
-    if (sendto(m->sock, buffer, length, 0, (struct sockaddr *)&m->address, 
-        sizeof(m->address)) < 0) {
-        perror("solicit: udp_tx: sendto");
-        return 0;
-    }
-    
-    return 1;
+  /* send the packet */
+  if (sendto(m->sock, buffer, length, 0, (struct sockaddr *)&m->address, 
+	     sizeof(m->address)) < 0) {
+    perror("solicit: udp_tx: sendto");
+    return 0;
+  }
+  
+  return 1;
 }
 
 void solicit(int force)
 {
-    int i, nplayers=0, nfree=0; 
-    char packet[MAXMETABYTES];
-    static char prior[MAXMETABYTES];
-    char *here = packet;
-    time_t now = time(NULL);
-   
-    /* perform first time initialisation */ 
-    if (initialised == 0) {
-	FILE *file;
-
-	/* clear metaserver socket list */
-	for (i=0; i<MAXMETASERVERS; i++) metaservers[i].sock = -1;
-
-	/* open the metaserver list file */
-	file = fopen(".metaservers", "r"); /* ??? LIBDIR prefix? */
-	if (file == NULL) {
-	    initialised++;
-	    return;
-	}
-	
-	/* read the metaserver list file */
-	for (i=0; i<MAXMETASERVERS; i++)
-	{
-	    struct metaserver *m = &metaservers[i];
-
-	    /* if end of file reached, stop */
-	    if (feof(file)) break;
-
-	    /* scan the line */
-	    fscanf(file, "%s %d %d %d %s %s %d %d %s/n", m->host, &m->port,
-		&m->minimum, &m->maximum, m->ours, m->type, &m->pport,
-		&m->oport, m->comment);
-
-	    /* force minimum and maximum delays (see note on #define) */
-	    if (m->minimum < META_MINIMUM_DELAY)
-		m->minimum = META_MINIMUM_DELAY;
-	    if (m->maximum > META_MAXIMUM_DELAY)
-		m->maximum = META_MAXIMUM_DELAY;
-
-	    /* attach to the metaserver (DNS lookup is only delay) */
-	    udp_attach(m);
-	    /* place metaserver addresses in /etc/hosts to speed this */
-	    /* use numeric metaserver address to speed this */
-
-	    /* initialise the other parts of the structure */
-	    m->sent = 0;
-	    strcpy(m->prior, "");
-	}
-        initialised++;
+  int i, nplayers=0, nfree=0; 
+  char packet[MAXMETABYTES];
+  static char prior[MAXMETABYTES];
+  char *here = packet;
+  time_t now = time(NULL);
+  
+  /* perform first time initialisation */ 
+  if (initialised == 0) {
+    FILE *file;
+    
+    /* clear metaserver socket list */
+    for (i=0; i<MAXMETASERVERS; i++) metaservers[i].sock = -1;
+    
+    /* open the metaserver list file */
+    file = fopen(".metaservers", "r"); /* ??? LIBDIR prefix? */
+    if (file == NULL) {
+      initialised++;
+      return;
     }
-
-    /* update each metaserver */
-    for (i=0; i<MAXMETASERVERS; i++)
-    {
-	struct metaserver *m = &metaservers[i];
-	int j;
-
-	/* skip empty metaserver entries */
-	if (m->sock == -1) continue;
-
-	/* if we told metaserver recently, don't speak yet */
-	if (!force)
-	    if ((now-m->sent) < m->minimum) continue;
-
-        /* count up the number of free slots and players */
-        for (j=0; j<MAXPLAYER; j++)
-            if (players[j].p_status == PFREE)
-                nfree++;
-            else
-                nplayers++;
-
-        /* if the free slots are zero, translate it to a queue length */
-        if (nfree == 0) nfree = -queues[QU_PICKUP].count;
     
-        /* build start of the packet, the server information */
-        sprintf(here, "%s\n%s\n%s\n%d\n%d\n%d\n%d\n%s\n%s\n",
-            /* version */   "a",
-            /* address */   m->ours,
-            /* type    */   m->type,
-            /* port    */   m->pport,
-            /* observe */   m->oport,
-            /* players */   nplayers,
-            /* free    */   nfree,
-            /* t-mode  */   status->tourn ? "y" : "n",
-            /* comment */   m->comment
-        );
-        here += strlen(here);
-
-        /* now append per-player information to the packet */
-        for (j=0; j<MAXPLAYER; j++) {
-            /* ignore free slots */
-            if (players[j].p_status == PFREE || players[j].p_stats.st_tticks==0)
-                continue;
-            sprintf(here, "%c\n%c\n%d\n%d\n%s\n%s@%s\n",
+    /* read the metaserver list file */
+    for (i=0; i<MAXMETASERVERS; i++) {
+      struct metaserver *m = &metaservers[i];
+      
+      /* if end of file reached, stop */
+      if (feof(file)) break;
+      
+      /* scan the line */
+      fscanf(file, "%s %d %d %d %s %s %d %d %s/n", m->host, &m->port,
+	     &m->minimum, &m->maximum, m->ours, m->type, &m->pport,
+	     &m->oport, m->comment);
+      
+      /* force minimum and maximum delays (see note on #define) */
+      if (m->minimum < META_MINIMUM_DELAY)
+	m->minimum = META_MINIMUM_DELAY;
+      if (m->maximum > META_MAXIMUM_DELAY)
+	m->maximum = META_MAXIMUM_DELAY;
+      
+      /* attach to the metaserver (DNS lookup is only delay) */
+      udp_attach(m);
+      /* place metaserver addresses in /etc/hosts to speed this */
+      /* use numeric metaserver address to speed this */
+      
+      /* initialise the other parts of the structure */
+      m->sent = 0;
+      strcpy(m->prior, "");
+    }
+    initialised++;
+    fclose(file);
+  }
+  
+  /* update each metaserver */
+  for (i=0; i<MAXMETASERVERS; i++) {
+    struct metaserver *m = &metaservers[i];
+    int j;
+    
+    /* skip empty metaserver entries */
+    if (m->sock == -1) continue;
+    
+    /* if we told metaserver recently, don't speak yet */
+    if (!force)
+      if ((now-m->sent) < m->minimum) continue;
+    
+    /* don't remake the packet unless necessary */
+    if ( here == packet ) {
+      
+      /* count up the number of free slots and players */
+      for (j=0; j<MAXPLAYER; j++)
+	if (players[j].p_status == PFREE)
+	  nfree++;
+	else
+	  nplayers++;
+      
+      /* if the free slots are zero, translate it to a queue length */
+      if (nfree == 0) nfree = -queues[QU_PICKUP].count;
+      
+      /* build start of the packet, the server information */
+      sprintf(here, "%s\n%s\n%s\n%d\n%d\n%d\n%d\n%s\n%s\n",
+	      /* version */   "a",
+	      /* address */   m->ours,
+	      /* type    */   m->type,
+	      /* port    */   m->pport,
+	      /* observe */   m->oport,
+	      /* players */   nplayers,
+	      /* free    */   nfree,
+	      /* t-mode  */   status->tourn ? "y" : "n",
+	      /* comment */   m->comment
+	      );
+      here += strlen(here);
+      
+      /* now append per-player information to the packet */
+      for (j=0; j<MAXPLAYER; j++) {
+	/* ignore free slots */
+	if (players[j].p_status == PFREE || players[j].p_stats.st_tticks==0)
+	  continue;
+	sprintf(here, "%c\n%c\n%d\n%d\n%s\n%s@%s\n",
                 /* number */   players[j].p_mapchars[1], 
                 /* team   */   players[j].p_mapchars[0],
                 /* class  */   players[j].p_ship.s_type,
@@ -211,20 +209,21 @@
                 /* name   */   players[j].p_name,
                 /* user   */   players[j].p_login,
                 /* host   */   players[j].p_monitor );
-            here += strlen(here);
-        }
-
-	/* if we have exceeded the maximum time, force an update */
-	if ((now-m->sent) > m->maximum) force=1;
-
-	/* if we are not forcing an update, and nothing has changed, drop */
-	if (!force)
-	    if (!strcmp(packet, m->prior)) continue;
-
-        /* send the packet */
-        if (udp_tx(m, packet, here-packet)) {
-            m->sent=time(NULL);
-            strcpy(m->prior, packet);
-        }
+	here += strlen(here);
+      }
+    }
+    
+    /* if we have exceeded the maximum time, force an update */
+    if ((now-m->sent) > m->maximum) force=1;
+    
+    /* if we are not forcing an update, and nothing has changed, drop */
+    if (!force)
+      if (!strcmp(packet, m->prior)) continue;
+    
+    /* send the packet */
+    if (udp_tx(m, packet, here-packet)) {
+      m->sent=time(NULL);
+      strcpy(m->prior, packet);
     }
+  }
 }