[CF-Devel] patch: gcc 3.3 infinite loop fixed

crossfire-devel at archives.real-time.com crossfire-devel at archives.real-time.com
Wed Dec 10 13:00:28 CST 2003


After a session with ddd, CFLAGS="-g -O1 -Wall -W -pedantic"
and even valgrind, i found a lot of minor stuff, and
finally the real problem. :)

Summary by file:

common/item.c
The vital fix. Wrong buffer size was used.

common/object.c
reading uninitialized value (valgrind)

include/define.h
typo in function safe_strncpy,
trailing comma in enum (pedantic)

include/global.h
c++ style comments

include/player.h
trailing comma in enum (pedantic)

socket/init.c
reading uninitialized value (valgrind)

Bernd Edler
-------------- next part --------------
Index: common/item.c
===================================================================
RCS file: /cvsroot/crossfire/crossfire/common/item.c,v
retrieving revision 1.38
diff -c -r1.38 item.c
*** common/item.c	13 Sep 2003 05:01:27 -0000	1.38
--- common/item.c	10 Dec 2003 18:06:00 -0000
***************
*** 603,617 ****
  	case ROD:
  	    if (QUERY_FLAG(op,FLAG_IDENTIFIED)||QUERY_FLAG(op,FLAG_BEEN_APPLIED)) {
  		if(!op->title) {
! 		    safe_strcat(buf," of ", &len, HUGE_BUF);
  		    if (op->inv) 
! 			safe_strcat(buf,op->inv->name, &len, HUGE_BUF);
  		    else
  			LOG(llevError,"Spellbook %s lacks inventory\n", op->name);
  		}
  		if(op->type != SPELLBOOK) {
  		    sprintf(buf2, " (lvl %d)", op->level);
! 		    safe_strcat(buf, buf2, &len, HUGE_BUF);
  		}
  	    }
  	    break;
--- 603,617 ----
  	case ROD:
  	    if (QUERY_FLAG(op,FLAG_IDENTIFIED)||QUERY_FLAG(op,FLAG_BEEN_APPLIED)) {
  		if(!op->title) {
! 		    safe_strcat(buf," of ", &len, MAX_BUF);
  		    if (op->inv) 
! 			safe_strcat(buf,op->inv->name, &len, MAX_BUF);
  		    else
  			LOG(llevError,"Spellbook %s lacks inventory\n", op->name);
  		}
  		if(op->type != SPELLBOOK) {
  		    sprintf(buf2, " (lvl %d)", op->level);
! 		    safe_strcat(buf, buf2, &len, MAX_BUF);
  		}
  	    }
  	    break;
Index: common/object.c
===================================================================
RCS file: /cvsroot/crossfire/crossfire/common/object.c,v
retrieving revision 1.75
diff -c -r1.75 object.c
*** common/object.c	27 Oct 2003 07:24:14 -0000	1.75
--- common/object.c	10 Dec 2003 18:06:04 -0000
***************
*** 510,516 ****
      if (op->msg!=NULL)	    FREE_AND_CLEAR_STR(op->msg);
      if (op->lore!=NULL)	    FREE_AND_CLEAR_STR(op->lore);
      if (op->materialname!= NULL) FREE_AND_CLEAR_STR(op->materialname);
! 
  
      /* Using this memset is a lot easier (and probably faster)
       * than explicitly clearing the fields.
--- 510,517 ----
      if (op->msg!=NULL)	    FREE_AND_CLEAR_STR(op->msg);
      if (op->lore!=NULL)	    FREE_AND_CLEAR_STR(op->lore);
      if (op->materialname!= NULL) FREE_AND_CLEAR_STR(op->materialname);
!     op->active_next = NULL;
!     op->active_prev = NULL;
  
      /* Using this memset is a lot easier (and probably faster)
       * than explicitly clearing the fields.
Index: include/define.h
===================================================================
RCS file: /cvsroot/crossfire/crossfire/include/define.h,v
retrieving revision 1.69
diff -c -r1.69 define.h
*** include/define.h	27 Oct 2003 03:44:33 -0000	1.69
--- include/define.h	10 Dec 2003 18:06:07 -0000
***************
*** 721,727 ****
      strncpy(dest+*curlen, orig, maxlen-*curlen-1);
      dest[maxlen-1]=0;
      *curlen += strlen(orig);
!     if (*curlen>(maxlen-1)) *curlen=maxlen=1;
  }
  
  
--- 721,727 ----
      strncpy(dest+*curlen, orig, maxlen-*curlen-1);
      dest[maxlen-1]=0;
      *curlen += strlen(orig);
!     if (*curlen>(maxlen-1)) *curlen=maxlen-1;
  }
  
  
***************
*** 807,813 ****
    /* Optional flags, for bitwise or with a basic flag */
      AP_NO_MERGE			= 16,
      AP_IGNORE_CURSE		= 32,
!     AP_PRINT			= 64,	/* Print what to do, don't actually do it */
  					/* Note this is supported in all the functions */
  
  };
--- 807,813 ----
    /* Optional flags, for bitwise or with a basic flag */
      AP_NO_MERGE			= 16,
      AP_IGNORE_CURSE		= 32,
!     AP_PRINT			= 64	/* Print what to do, don't actually do it */
  					/* Note this is supported in all the functions */
  
  };
Index: include/global.h
===================================================================
RCS file: /cvsroot/crossfire/crossfire/include/global.h,v
retrieving revision 1.44
diff -c -r1.44 global.h
*** include/global.h	13 Sep 2003 05:01:33 -0000	1.44
--- include/global.h	10 Dec 2003 18:06:07 -0000
***************
*** 60,73 ****
  typedef unsigned short Fontindex;
  
  #ifdef WIN32
! // Python plugin stuff defines SIZEOF_LONG_LONG as 8, and besides __int64 is a 64b type on MSVC...
! // So let's force the typedef
  typedef unsigned __int64	uint64;
  typedef signed __int64		sint64;
! // Needed for experience
  #define atoll	_atoi64
  
! #else // WIN32
  
  #if SIZEOF_LONG == 8
  typedef unsigned long	    uint64;
--- 60,75 ----
  typedef unsigned short Fontindex;
  
  #ifdef WIN32
! /* Python plugin stuff defines SIZEOF_LONG_LONG as 8, and besides __int64 is a 64b type on MSVC...
!  * So let's force the typedef
!  */
  typedef unsigned __int64	uint64;
  typedef signed __int64		sint64;
! /* Needed for experience */
  #define atoll	_atoi64
  
! #else
! /* WIN32 */
  
  #if SIZEOF_LONG == 8
  typedef unsigned long	    uint64;
Index: include/player.h
===================================================================
RCS file: /cvsroot/crossfire/crossfire/include/player.h,v
retrieving revision 1.33
diff -c -r1.33 player.h
*** include/player.h	13 Sep 2003 05:01:34 -0000	1.33
--- include/player.h	10 Dec 2003 18:06:08 -0000
***************
*** 72,78 ****
  typedef enum usekeytype {
      key_inventory=0,
      keyrings=1,
!     containers=2,
  } usekeytype;
  
  /* This is used to control what to do when we need to unapply
--- 72,78 ----
  typedef enum usekeytype {
      key_inventory=0,
      keyrings=1,
!     containers=2
  } usekeytype;
  
  /* This is used to control what to do when we need to unapply
***************
*** 81,87 ****
  typedef enum unapplymode {
      unapply_nochoice=0,	    /* Will unapply objects when there no choice to unapply */
      unapply_never=1,	    /* will not unapply objects automatically */
!     unapply_always=2,	    /* Will unapply whatever is necessary - this goes beyond */
  			    /* no choice - if there are multiple ojbect of the same type */
  			    /* that need to be unapplied, there is no way for the player */
  			    /* to control which of these will be unapplied. */
--- 81,87 ----
  typedef enum unapplymode {
      unapply_nochoice=0,	    /* Will unapply objects when there no choice to unapply */
      unapply_never=1,	    /* will not unapply objects automatically */
!     unapply_always=2	    /* Will unapply whatever is necessary - this goes beyond */
  			    /* no choice - if there are multiple ojbect of the same type */
  			    /* that need to be unapplied, there is no way for the player */
  			    /* to control which of these will be unapplied. */
Index: socket/init.c
===================================================================
RCS file: /cvsroot/crossfire/crossfire/socket/init.c,v
retrieving revision 1.30
diff -c -r1.30 init.c
*** socket/init.c	13 Sep 2003 05:02:14 -0000	1.30
--- socket/init.c	10 Dec 2003 18:06:17 -0000
***************
*** 67,72 ****
--- 67,73 ----
      int	bufsize=65535;	/*Supposed absolute upper limit */
      int oldbufsize;
      int buflen=sizeof(int);
+     int i;
  
  #ifdef WIN32 /* ***WIN32 SOCKET: init win32 non blocking socket */
  	int temp = 1;	
***************
*** 113,118 ****
--- 114,121 ----
      ns->itemcmd = 1;	/* Default is version item1 command*/
      ns->ext_mapinfos=0; /*extendedmapinfo datas*/
      ns->EMI_smooth=0; 
+     ns->look_position=0;
+     ns->update_look=0;
  
      /* we should really do some checking here - if total clients overflows
       * we need to do something more intelligent, because client id's will start
***************
*** 125,131 ****
       * HandleClient for oldsocketmode without checking the
       * length of data.
       */
!     ns->inbuf.buf[0] = 0;
      memset(&ns->lastmap,0,sizeof(struct Map));
      memset(&ns->faces_sent,0,sizeof(ns->faces_sent));
      memset(&ns->anims_sent,0,sizeof(ns->anims_sent));
--- 128,135 ----
       * HandleClient for oldsocketmode without checking the
       * length of data.
       */
!     for (i = 0; i<MAXSOCKBUF; i++ )
!           ns->inbuf.buf[i] = 0;
      memset(&ns->lastmap,0,sizeof(struct Map));
      memset(&ns->faces_sent,0,sizeof(ns->faces_sent));
      memset(&ns->anims_sent,0,sizeof(ns->anims_sent));
-------------- next part --------------
_______________________________________________
crossfire-devel mailing list
     
     crossfire-devel at lists.real-time.com
     
     
     https://mailman.real-time.com/mailman/listinfo/crossfire-devel
     
     
    


More information about the crossfire mailing list