dmake (1:4.12-2) fix-overlapping-stcpys.diff

Summary

 dag.c      |    9 ++++++---
 expand.c   |   26 +++++++++++++++++++-------
 getinp.c   |    6 ++++--
 make.c     |   15 ++++++++++-----
 path.c     |   10 +++++++---
 rulparse.c |    5 +++--
 6 files changed, 49 insertions(+), 22 deletions(-)

    
download this patch

Patch contents

diff -ru dmake.orig/rulparse.c dmake/rulparse.c
--- dmake.orig/rulparse.c	2009-07-29 13:31:47.000000000 +0100
+++ dmake/rulparse.c	2009-07-29 13:32:09.000000000 +0100
@@ -897,7 +897,7 @@
 	 /* Handle %-targets. */
 	 CELLPTR cur;
 	 CELLPTR tpq = NIL(CELL);
-	 CELLPTR nprq;
+	 CELLPTR nprq = NULL;
 
 #ifdef DBUG
 	 DB_PRINT( "%", ("Handling %%-target [%s : : <prerequisites follow, maybe empty>]",
@@ -915,7 +915,8 @@
 
 	    if( *name == '\'' && name[len-1]=='\'' ){
 	       name[len-1] = '\0';
-	       strcpy(name,name+1);
+	       len = strlen(name+1)+1;
+	       memmove(name,name+1,len);
 	       /* add indirect prerequisite */
 	       _add_indirect_prereq( cur );
 	    }
diff -ru dmake.orig/dag.c dmake/dag.c
--- dmake.orig/dag.c	2009-08-07 20:18:31.000000000 +0100
+++ dmake/dag.c	2009-08-07 20:30:59.000000000 +0100
@@ -369,14 +369,17 @@
 	 /* strip out any \<nl> combinations where \ is the current
 	  * CONTINUATION char */
 	 for(p=q; (p=strchr(p,CONTINUATION_CHAR))!=NIL(char); )
-	    if( p[1] == '\n' )
-	       strcpy( p, p+2 );
+	    if( p[1] == '\n' ) {
+	       size_t len = strlen(p+2)+1;
+	       memmove ( p, p+2, len );
+	    }
 	    else
 	       p++;
 
 	 p = DmStrSpn(q ," \t");	/* Strip white space before ... */
 	 if( p != q ) {
-	    strcpy( q, p);
+	    size_t len = strlen(p)+1;
+	    memmove( q, p, len );
 	    p = q;
 	 }
 
diff -ru dmake.orig/expand.c dmake/expand.c
--- dmake.orig/expand.c	2009-08-07 20:18:34.000000000 +0100
+++ dmake/expand.c	2009-08-07 20:42:40.000000000 +0100
@@ -230,6 +230,7 @@
 char *tok;
 {
    if( strchr( "\"\\vantbrf01234567", tok[1] ) ) {
+      size_t len;
       switch( tok[1] ) {
 	 case 'a' : *tok = 0x07; break;
 	 case 'b' : *tok = '\b'; break;
@@ -246,13 +247,15 @@
 	    register int j = 0;
 	    for( ; i<2 && isdigit(tok[2]); i++ ) {
 	       j = (j << 3) + (tok[1] - '0');
-	       strcpy( tok+1, tok+2 );
+	       len = strlen(tok+2)+1;
+	       memmove( tok+1, tok+2, len );
 	    }
 	    j = (j << 3) + (tok[1] - '0');
 	    *tok = j;
 	 }
       }
-      strcpy( tok+1, tok+2 );
+      len = strlen(tok+2)+1;
+      memmove( tok+1, tok+2, len );
    }
 }
 
@@ -365,7 +368,8 @@
       if( (e = Basename(s)) != s) {
 	 if( !(mod & DIRECTORY_FLAG) ) {
 	    /* Move the basename to the start. */
-	    strcpy(s, e);
+	    size_t len = strlen(e)+1;
+	    memmove(s, e, len);
 	 }
 	 else
 	    s = e;
@@ -382,7 +386,8 @@
 
       if( !(mod & FILE_FLAG) ) {
 	 /* Move the suffix to the start. */
-	 strcpy( s, e );
+	 size_t len = strlen(e)+1;
+         memmove(s, e, len);
       }
       else
 	 s = e;
@@ -725,8 +730,10 @@
 	      done = !lev;
 	      break;
             } else {
+              size_t len;
 	      s[1] = ' ';
-	      strcpy( s, s+1 );
+              len = strlen(s+1)+1;
+	      memmove( s, s+1, len );
 	    }
 	    /*FALLTHRU*/
 	 case ' ':
@@ -835,8 +842,10 @@
        * converted them to a real space. Let's verify this. */
       for( p=s; *p && *p != edelim && *p; p++ ) {
 	if( p[0] == '\\' && p[1] == '\n' ) {
+	  size_t len;
 	  p[1] = ' ';
-	  strcpy( p, p+1 );
+	  len = strlen(p+1)+1;
+	  memmove( p, p+1, len );
 	}
       }
       if( !*p )
@@ -1120,7 +1129,10 @@
       *flag = 1;
       res   = Expand( start );
 
-      if( (t = DmStrSpn( res, " \t" )) != res ) strcpy( res, t );
+      if( (t = DmStrSpn( res, " \t" )) != res ) {
+          size_t len = strlen(t)+1;
+          memmove( res, t, len );
+      }
    }
 
    FREE( start );       /* this is ok! start is assigned a DmSubStr above */
diff -ru dmake.orig/getinp.c dmake/getinp.c
--- dmake.orig/getinp.c	2009-08-07 20:18:31.000000000 +0100
+++ dmake/getinp.c	2009-08-07 20:27:08.000000000 +0100
@@ -169,7 +169,8 @@
 	  * text lines on input.  The maximum size of this is governened by
 	  * Buffer_size */
 	    if( q != p && q[-1] == CONTINUATION_CHAR ) {
-	       strcpy( q, q+1 );
+	       size_t len = strlen(q+1)+1;
+	       memmove( q, q+1, len );
 	       q--;
 	       cont = FALSE;
 	    }
@@ -290,7 +291,8 @@
    while( (c = strchr(c, COMMENT_CHAR)) != NIL(char) ) {
       if( Comment || State == NORMAL_SCAN )
 	 if( c != str && c[-1] == ESCAPE_CHAR ) {
-	    strcpy( c-1, c );        /* copy it left, due to \# */
+	    size_t len = strlen(c)+1;
+	    memmove( c-1, c, len );  /* copy it left, due to \# */
 	    if( pend ) (*pend)--;    /* shift tail pointer left */
 	 }
 	 else {
diff -ru dmake.orig/path.c dmake/path.c
--- dmake.orig/path.c	2009-08-07 20:18:31.000000000 +0100
+++ dmake/path.c	2009-08-07 20:41:30.000000000 +0100
@@ -172,6 +172,7 @@
    char *tpath;
    int hasdriveletter = 0;
    int delentry;
+   size_t len;
 
    DB_ENTER( "Clean_path" );
 
@@ -231,14 +232,16 @@
 	    p++;
 	 }
 	 while( *p == *DirSepStr);
-	 strcpy(t+1,p);
+	 len = strlen(p)+1;
+	 memmove(t+1,p,len);
 	 continue;
       }
 
       /* Remove './'. If OOODMAKEMODE is set do this only if it is not at
        * the start of the path. */
       if ( p-q == 1 && *q == '.' && (q != path || !STOBOOL(OOoDmMode)) ) {
-	 strcpy(q,p+1);
+	 len = strlen(p+1)+1;
+	 memmove(q,p+1,len);
 	 q = tpath;
 	 continue;
       }
@@ -268,7 +271,8 @@
 	 }
 	 while( *t == *DirSepStr);
 	 /* q points to first letter of the current directory/file. */
-	 strcpy(q,t);
+	 len = strlen(t)+1;
+	 memmove(q,t,len);
 	 q = tpath;
       }
       else
--- dmake.orig/make.c	2009-08-08 09:56:10.000000000 +0100
+++ dmake/make.c	2009-08-08 10:00:04.000000000 +0100
@@ -1352,8 +1352,10 @@
        * Nothing in Expand() should be able to change dynamic macros. */
       cmnd = Expand( rp->st_string );
 
-      if( new_attr && (p = DmStrSpn(cmnd," \t\n+-@%")) != cmnd )
-	 strcpy(cmnd,p);
+      if( new_attr && (p = DmStrSpn(cmnd," \t\n+-@%")) != cmnd ) {
+	 size_t len = strlen(p)+1;
+	 memmove(cmnd,p,len);
+      }
 
       /* COMMAND macro is set to "$(CMNDNAME) $(CMNDARGS)" by default, it is
        * possible for the user to reset it to, for example
@@ -1381,8 +1383,10 @@
 	 shell  = ((l_attr & A_SHELL) != 0);
 
 	 /* clean up the attributes that we may have just added. */
-	 if( (p = DmStrSpn(cmnd," \t\n+-@%")) != cmnd )
-	    strcpy(cmnd,p);
+	 if( (p = DmStrSpn(cmnd," \t\n+-@%")) != cmnd ) {
+	    size_t len = strlen(p)+1;
+	    memmove(cmnd,p,len);
+	 }
       }
 
 #if defined(MSDOS)
@@ -1477,8 +1481,9 @@
    for( p=cmnd; *(n = DmStrPbrk(p,tmp)) != '\0'; )
       /* Remove the \<nl> sequences. */
       if(*n == CONTINUATION_CHAR && n[1] == '\n') {
+	 size_t len = strlen(n+2)+1;
 	 DB_PRINT( "make", ("fixing [%s]", p) );
-	 strcpy( n, n+2 );
+	 memmove( n, n+2, len );
 	 p = n;
       }
       /* Look for an escape sequence and replace it by it's corresponding