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 : : ]", @@ -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 \ 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 \ 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