Login
User Name:

Password:



Register
Forgot your password?
Vote for Us!
 parse description bug
Yesterday, 10:08 pm
By Remcon
Couple bugs
Dec 12, 2017, 5:42 pm
By Remcon
Bug in disarm( )
Nov 12, 2017, 6:54 pm
By GatewaySysop
Bug in will_fall( )
Oct 23, 2017, 1:35 am
By GatewaySysop
Bug in do_zap( ), do_brandish( )
Oct 18, 2017, 1:52 pm
By GatewaySysop
LOP 1.45
Author: Remcon
Submitted by: Remcon
LOP Heroes Edition
Author: Vladaar
Submitted by: Vladaar
Heroes sound extras
Author: Vladaar
Submitted by: Vladaar
6Dragons 4.3
Author: Vladaar
Submitted by: Vladaar
Memwatch
Author: Johan Lindh
Submitted by: Vladaar
Users Online
CommonCrawl, Yahoo!, Yandex, DotBot, Bing, Google

Members: 0
Guests: 7
Stats
Files
Topics
Posts
Members
Newest Member
477
3,706
19,240
608
LAntorcha
Today's Birthdays
There are no member birthdays today.
Related Links
» SmaugMuds.org » Bugfix Lists » SWR FUSS Bugfix List » [Bug] The STRFREE and DISPOSE...
Forum Rules | Mark all | Recent Posts

[Bug] The STRFREE and DISPOSE macro fixes are not safe in C afterall
< Newer Topic :: Older Topic >

Pages:<< prev 1 next >>
Post is unread #1 Aug 26, 2005, 5:22 am
Go to the top of the page
Go to the bottom of the page

Samson
Black Hand
GroupAdministrators
Posts3,639
JoinedJan 1, 2002

Bug: The STRFREE and DISPOSE macro fixes are not safe in C afterall
Danger: Extreme - Crashes, data corruption possible.
Found by: Zeno
Fixed by: Reversion to old macros

---

mud.h

Locate:
#define DISPOSE(point)                      \
do                                          \
{                                           \
   if( (point) )                            \
   {                                        \
      if( in_hash_table( (char*)(point) ) ) \
      {                                     \
         bug( "&RDISPOSE called on STRALLOC pointer: %s, line %d", __FILE__, __LINE__ ); \
         log_string( "Attempting to correct." ); \
         if( str_free( (char*)(point) ) == -1 )  \
            bug( "&RSTRFREEing bad pointer: %s, line %d", __FILE__, __LINE__ ); \
      }                                     \
      else                                  \
         free( (point) );                   \
      (point) = NULL;                       \
   }                                        \
} while(0)


Replace with original:
#define DISPOSE(point)                      \
do                                          \
{                                           \
   if( (point) )                            \
   {                                        \
      free( (point) );                      \
      (point) = NULL;                       \
   }                                        \
} while(0)


Locate:
#define STRFREE(point)                          \
do                                              \
{                                               \
   if((point))                                  \
   {                                            \
      if( !in_hash_table( (point) ) )           \
      {                                         \
         bug( "&RSTRFREE called on str_dup pointer: %s, line %d", __FILE__, __LINE__ ); \
         log_string( "Attempting to correct." ); \
         free( (point) );                       \
      }                                         \
      else if( str_free((point)) == -1 )        \
         bug( "&RSTRFREEing bad pointer: %s, line %d", __FILE__, __LINE__ ); \
      (point) = NULL;                           \
   }                                            \
} while(0)


Replace with original:
#define STRFREE(point)                          \
do                                              \
{                                               \
   if((point))                                  \
   {                                            \
      if( str_free((point)) == -1 )             \
         bug( "&RSTRFREEing bad pointer: %s, line %d", __FILE__, __LINE__ ); \
      (point) = NULL;                           \
   }                                            \
} while(0)


Turns out that the method for trying to check a pointer in DISPOSE to see if it's a char* does not work safely in C afterall and needs to be reverted out. It is apparently a ticking timebomb waiting to explode literally at any time.
       
Pages:<< prev 1 next >>