From 5b521b045bcc8cb9e4ddd984e8126b9719cb1ce2 Mon Sep 17 00:00:00 2001
From: "Kurt A. O'Hearn" <ohearnk@msu.edu>
Date: Wed, 7 Feb 2018 20:57:11 -0500
Subject: [PATCH] sPuReMD: fixes to remove compilatoin warnings. Replace
 standard library functions with safer versions to avoid buffer overruns.
 Safer use of placeholders in format strings for printing.

---
 sPuReMD/src/analyze.c     |  8 +++++++-
 sPuReMD/src/ffield.c      |  2 +-
 sPuReMD/src/geo_tools.c   |  6 +++---
 sPuReMD/src/init_md.c     |  4 ++--
 sPuReMD/src/lin_alg.c     |  6 ++++++
 sPuReMD/src/print_utils.c | 22 +++++++++++-----------
 sPuReMD/src/tool_box.c    | 18 +++++++++++++-----
 sPuReMD/src/tool_box.h    |  2 +-
 sPuReMD/src/traj.c        |  8 ++++----
 9 files changed, 48 insertions(+), 28 deletions(-)

diff --git a/sPuReMD/src/analyze.c b/sPuReMD/src/analyze.c
index 9fcd54f7..675e9007 100644
--- a/sPuReMD/src/analyze.c
+++ b/sPuReMD/src/analyze.c
@@ -21,6 +21,8 @@
 
 #include "analyze.h"
 
+#include <ctype.h>
+
 #include "box.h"
 #include "list.h"
 #include "tool_box.h"
@@ -580,8 +582,12 @@ void Analyze_Fragments( reax_system *system, control_params *control,
 
     /* output the results of fragment analysis */
     for ( i = 0; i < num_fragment_types; ++i )
-        if ( strlen(fragments[i]) )
+    {
+        if ( strnlen(fragments[i], MAX_ATOM_TYPES) )
+        {
             fprintf( fout, "%d of %s\n", fragment_count[i], fragments[i] );
+        }
+    }
     fprintf( fout, "\n" );
     fflush( fout );
 
diff --git a/sPuReMD/src/ffield.c b/sPuReMD/src/ffield.c
index 7aab5c52..1fb05c45 100644
--- a/sPuReMD/src/ffield.c
+++ b/sPuReMD/src/ffield.c
@@ -167,7 +167,7 @@ char Read_Force_Field( FILE* fp, reax_interaction* reax )
         fgets( s, MAX_LINE, fp );
         Tokenize( s, &tmp );
 
-        for ( j = 0; j < strlen( tmp[0] ); ++j )
+        for ( j = 0; j < strnlen( tmp[0], MAX_TOKEN_LEN ); ++j )
             reax->sbp[i].name[j] = toupper( tmp[0][j] );
 
         val = atof(tmp[1]);
diff --git a/sPuReMD/src/geo_tools.c b/sPuReMD/src/geo_tools.c
index 740a9648..549d29ff 100644
--- a/sPuReMD/src/geo_tools.c
+++ b/sPuReMD/src/geo_tools.c
@@ -365,7 +365,7 @@ char Read_PDB( const char * const pdb_file, reax_system* system, control_params
             pdb_serial = (int) strtod( &serial[0], &endptr );
             workspace->orig_id[top] = pdb_serial;
 
-            Trim_Spaces( element );
+            Trim_Spaces( element, 9 );
             atom->type = Get_Atom_Type( &(system->reaxprm), element );
             strcpy( atom->name, atom_name );
 
@@ -492,7 +492,7 @@ char Write_PDB( reax_system* system, reax_list* bonds, simulation_data *data,
     {
         p_atom = &(system->atoms[i]);
         strncpy(name, p_atom->name, 8);
-        Trim_Spaces(name);
+        Trim_Spaces( name, 8 );
         snprintf( line, MAX_STR, PDB_ATOM_FORMAT_O,
                  "ATOM  ", workspace->orig_id[i], p_atom->name, ' ', "REX", ' ', 1, ' ',
                  p_atom->x[0], p_atom->x[1], p_atom->x[2],
@@ -711,7 +711,7 @@ char Read_BGF( const char * const bgf_file, reax_system* system, control_params
 
             /* atom name and type */
             strcpy( system->atoms[atom_cnt].name, atom_name );
-            Trim_Spaces( element );
+            Trim_Spaces( element, 10 );
             system->atoms[atom_cnt].type =
                 Get_Atom_Type( &(system->reaxprm), element );
 
diff --git a/sPuReMD/src/init_md.c b/sPuReMD/src/init_md.c
index 93fed761..c071a46f 100644
--- a/sPuReMD/src/init_md.c
+++ b/sPuReMD/src/init_md.c
@@ -773,11 +773,11 @@ void Init_Out_Controls( reax_system *system, control_params *control,
     /* Init molecular analysis file */
     if ( control->molec_anal )
     {
-        snprintf( temp, TEMP_SIZE + 4, "%s.mol", control->sim_name );
+        snprintf( temp, TEMP_SIZE, "%.*s.mol", TEMP_SIZE - 5, control->sim_name );
         out_control->mol = fopen( temp, "w" );
         if ( control->num_ignored )
         {
-            snprintf( temp, TEMP_SIZE + 4, "%s.ign", control->sim_name );
+            snprintf( temp, TEMP_SIZE, "%.*s.ign", TEMP_SIZE - 5, control->sim_name );
             out_control->ign = fopen( temp, "w" );
         }
     }
diff --git a/sPuReMD/src/lin_alg.c b/sPuReMD/src/lin_alg.c
index 110c43a3..5c5b7f47 100644
--- a/sPuReMD/src/lin_alg.c
+++ b/sPuReMD/src/lin_alg.c
@@ -3294,6 +3294,12 @@ int GMRES_HouseHolder( const static_storage * const workspace,
     reduction(+: t_ortho, t_pa, t_spmv, t_ts, t_vops)
 #endif
     {
+        t_ortho = 0.0;
+        t_pa = 0.0;
+        t_spmv = 0.0;
+        t_ts = 0.0;
+        t_vops = 0.0;
+
         t_start = Get_Time( );
         bnorm = Norm( b, N );
         t_vops += Get_Timing_Info( t_start );
diff --git a/sPuReMD/src/print_utils.c b/sPuReMD/src/print_utils.c
index 383fdb89..d37fe5ea 100644
--- a/sPuReMD/src/print_utils.c
+++ b/sPuReMD/src/print_utils.c
@@ -406,7 +406,7 @@ void Print_Near_Neighbors( reax_system *system, control_params *control,
     FILE *fout;
     reax_list *near_nbrs = &((*lists)[NEAR_NBRS]);
 
-    snprintf( fname, MAX_STR, "%s.near_nbrs", control->sim_name );
+    snprintf( fname, MAX_STR, "%.*s.near_nbrs", MAX_STR - 11, control->sim_name );
     fout = fopen( fname, "w" );
 
     for ( i = 0; i < system->N; ++i )
@@ -440,7 +440,7 @@ void Print_Near_Neighbors2( reax_system *system, control_params *control,
     FILE *fout;
     reax_list *near_nbrs = &((*lists)[NEAR_NBRS]);
 
-    snprintf( fname, MAX_STR, "%s.near_nbrs_lgj", control->sim_name );
+    snprintf( fname, MAX_STR, "%.*s.near_nbrs_lgj", MAX_STR - 15, control->sim_name );
     fout = fopen( fname, "w" );
 
     for ( i = 0; i < system->N; ++i )
@@ -475,7 +475,7 @@ void Print_Far_Neighbors( reax_system *system, control_params *control,
     FILE *fout;
     reax_list *far_nbrs = &((*lists)[FAR_NBRS]);
 
-    snprintf( fname, MAX_STR, "%s.far_nbrs", control->sim_name );
+    snprintf( fname, MAX_STR, "%.*s.far_nbrs", MAX_STR - 10, control->sim_name );
     fout = fopen( fname, "w" );
 
     for ( i = 0; i < system->N; ++i )
@@ -520,7 +520,7 @@ void Print_Far_Neighbors2( reax_system *system, control_params *control,
     FILE *fout;
     reax_list *far_nbrs = &((*lists)[FAR_NBRS]);
 
-    snprintf( fname, MAX_STR, "%s.far_nbrs_lgj", control->sim_name );
+    snprintf( fname, MAX_STR, "%.*s.far_nbrs_lgj", MAX_STR - 14, control->sim_name );
     fout = fopen( fname, "w" );
     int num = 0;
     int temp[500];
@@ -553,7 +553,7 @@ void Print_Total_Force( reax_system *system, control_params *control,
     int i;
 #if !defined(TEST_FORCES)
     char temp[1000];
-    snprintf( temp, 1000, "%s.ftot", control->sim_name );
+    snprintf( temp, 1000, "%.*s.ftot", 994, control->sim_name );
     out_control->ftot = fopen( temp, "w" );
 #endif
 
@@ -735,7 +735,7 @@ void Print_Linear_System( reax_system *system, control_params *control,
     sparse_matrix *H;
     FILE *out;
 
-    snprintf( fname, 100, "%s.state%d.out", control->sim_name, step );
+    snprintf( fname, 100, "%.*s.state%10d.out", 79, control->sim_name, step );
     out = fopen( fname, "w" );
 
     for ( i = 0; i < system->N_cm; i++ )
@@ -753,7 +753,7 @@ void Print_Linear_System( reax_system *system, control_params *control,
     // fprintf( out, "%g\n", workspace->s_t[i+system->N] );
     // fclose( out );
 
-    snprintf( fname, 100, "%s.H%d.out", control->sim_name, step );
+    snprintf( fname, 100, "%.*s.H%10d.out", 83, control->sim_name, step );
     out = fopen( fname, "w" );
     H = workspace->H;
 
@@ -776,7 +776,7 @@ void Print_Linear_System( reax_system *system, control_params *control,
 
     fclose( out );
 
-    snprintf( fname, 100, "%s.H_sp%d.out", control->sim_name, step );
+    snprintf( fname, 100, "%.*s.H_sp%10d.out", 80, control->sim_name, step );
     out = fopen( fname, "w" );
     H = workspace->H_sp;
 
@@ -799,13 +799,13 @@ void Print_Linear_System( reax_system *system, control_params *control,
 
     fclose( out );
 
-    /*snprintf( fname, 100, "%s.b_s%d", control->sim_name, step );
+    /*snprintf( fname, 100, "%.*s.b_s%10d", 84, control->sim_name, step );
       out = fopen( fname, "w" );
       for( i = 0; i < system->N; i++ )
       fprintf( out, "%12.7f\n", workspace->b_s[i] );
       fclose( out );
 
-      snprintf( fname, 100, "%s.b_t%d", control->sim_name, step );
+      snprintf( fname, 100, "%.*s.b_t%10d", 84, control->sim_name, step );
       out = fopen( fname, "w" );
       for( i = 0; i < system->N; i++ )
       fprintf( out, "%12.7f\n", workspace->b_t[i] );
@@ -820,7 +820,7 @@ void Print_Charges( reax_system *system, control_params *control,
     char fname[100];
     FILE *fout;
 
-    snprintf( fname, 100, "%s.q%d", control->sim_name, step );
+    snprintf( fname, 100, "%.*s.q%10d", 87, control->sim_name, step );
     fout = fopen( fname, "w" );
 
     for ( i = 0; i < system->N; ++i )
diff --git a/sPuReMD/src/tool_box.c b/sPuReMD/src/tool_box.c
index 3853c270..c0a61f51 100644
--- a/sPuReMD/src/tool_box.c
+++ b/sPuReMD/src/tool_box.c
@@ -19,7 +19,6 @@
   <http://www.gnu.org/licenses/>.
   ----------------------------------------------------------------------*/
 
-#include "mytypes.h"
 #include "tool_box.h"
 
 #include <ctype.h>
@@ -273,13 +272,22 @@ int Check_Input_Range( int val, int lo, int hi, char *message )
 }
 
 
-void Trim_Spaces( char *element )
+void Trim_Spaces( char * const element, const size_t size )
 {
-    int i, j;
+    int i, j, n;
+
+    n = strnlen( element, size );
+
+    /* buffer not NULL-terminated, abort */
+    if ( n == size )
+    {
+        return;
+    }
 
-    for ( i = 0; element[i] == ' '; ++i ); // skip initial space chars
+    for ( i = 0; element[i] == ' '; ++i )
+        ; // skip initial space chars
 
-    for ( j = i; j < (int)(strlen(element)) && element[j] != ' '; ++j )
+    for ( j = i; j < n && element[j] != ' '; ++j )
     {
         element[j - i] = toupper( element[j] ); // make uppercase, offset to 0
     }
diff --git a/sPuReMD/src/tool_box.h b/sPuReMD/src/tool_box.h
index d1b15f64..29781e00 100644
--- a/sPuReMD/src/tool_box.h
+++ b/sPuReMD/src/tool_box.h
@@ -56,7 +56,7 @@ int is_Valid_Serial( static_storage*, int );
 
 int Check_Input_Range( int, int, int, char* );
 
-void Trim_Spaces( char* );
+void Trim_Spaces( char * const, const size_t );
 
 /* from system_props.h */
 real Get_Time( );
diff --git a/sPuReMD/src/traj.c b/sPuReMD/src/traj.c
index 14e2a36b..7972d086 100644
--- a/sPuReMD/src/traj.c
+++ b/sPuReMD/src/traj.c
@@ -79,7 +79,7 @@ int Write_Custom_Header( reax_system *system, control_params *control,
              control->molec_anal,
              control->freq_molec_anal );
 
-    control_block_len = strlen( control_block );
+    control_block_len = strnlen( control_block, SIZE1 );
 
 
     snprintf( frame_format, SIZE1, "Frame Format: %d\n%s\n%s\n",
@@ -123,7 +123,7 @@ int Write_Custom_Header( reax_system *system, control_params *control,
     }
     strcat( frame_format, angle_format );
 
-    frame_format_len = strlen( frame_format );
+    frame_format_len = strnlen( frame_format, SIZE1 );
 
 
     header_len = HEADER_INIT_LEN + (control_block_len + SIZE_INFO_LEN2) +
@@ -309,7 +309,7 @@ int Append_Custom_Frame( reax_system *system, control_params *control,
              data->E_Ang, data->E_Pen, data->E_Coa, data->E_HB,
              data->E_Tor, data->E_Con,
              data->E_vdW, data->E_Ele, data->E_Pol );
-    frame_globals_len = strlen( buffer );
+    frame_globals_len = strnlen( buffer, SIZE );
 
     frame_len = frame_globals_len +
                 write_atoms  * SIZE_INFO_LEN3 + system->N * atom_line_len +
@@ -507,7 +507,7 @@ void Read_Traj( output_controls *out_control, char *traj_name )
 
         fprintf( stderr, "read line\n" );
 
-        if ( strlen( size_buffer ) >= SIZE_INFO_LEN3 )
+        if ( strnlen( size_buffer, 50 ) >= SIZE_INFO_LEN3 )
         {
             sscanf( size_buffer, "%d %d %d", &skip_all, &skip_part, &n );
         }
-- 
GitLab