fixing RMR messages with negative size
[ric-plt/lib/rmr.git] / src / rmr / si / src / si95 / sitrash.c
index efc2cd3..33c6801 100644 (file)
 
 /*
 ***************************************************************************
-*  
+*
 *  Mnemonic: sitrash
 *  Abstract: Delete all things referenced by a struct and then free the memory.
-*    
+*
 *  Returns:  Nothing
 *  Date:     08 March 2007
-*  Author:   E. Scott Daniels                            
+*  Author:   E. Scott Daniels
 *
-******************************************************************************   
+******************************************************************************
 */
 
 #include        "sisetup.h"
 #include               "sitransport.h"
-                 
+
 extern void SItrash( int type, void *bp )
 {
         struct tp_blk *tp = NULL;
         struct ioq_blk *iptr;
         struct ioq_blk *inext;
 
+               if( bp == NULL ) {
+                       return;
+               }
+
         switch( type )
         {
                 case IOQ_BLK:
@@ -48,24 +52,27 @@ extern void SItrash( int type, void *bp )
                         free( iptr->addr );
                         free( iptr );
                         break;
-            
-                case TP_BLK:                                            //  we assume its off the list 
+
+                case TP_BLK:                                            //  we assume its off the list
                         tp = (struct tp_blk *) bp;
-                        for( iptr = tp->squeue; iptr; iptr = inext )            //  trash any pending send buffers 
-                        {
+                                               iptr = tp->squeue;
+                                               while( iptr != NULL ) {
                                 inext = iptr->next;
-                                free( iptr->data );          //  we could recurse, but that seems silly 
+
+                                free( iptr->data );          //  we could recurse, but that seems silly
                                 free( iptr->addr );
                                 free( iptr );
+
+                                                               iptr = inext;
                         }
 
                                                if( tp->fd >= 0 ) {
                                                        CLOSE( tp->fd );
                                                }
-     
-                        free( tp->addr );             //  release the address bufers 
-                        free( tp->paddr );        
-                        free( tp );                   //  and release the block 
+
+                        free( tp->addr );             //  release the address bufers
+                        free( tp->paddr );
+                        free( tp );                   //  and release the block
                         break;
         }
 }