42d3218
Patch by Guillem Jover <guillem@debian.org> for arj <= 3.10.22, to
42d3218
use a safe strcpy for overlapping strings, among others fixes a build
42d3218
problem with a mangled generated .c file by msgbind (thus FTBFS), and
42d3218
CRC errors at run-time. For further information, please have a look
42d3218
to http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=590354
42d3218
42d3218
---
42d3218
 arj.c      |    2 +-
42d3218
 arjdata.c  |    9 +--------
42d3218
 ea_mgr.c   |    2 +-
42d3218
 misc.h     |    4 ++++
42d3218
 msgbind.c  |    2 +-
42d3218
 packager.c |    2 +-
42d3218
 6 files changed, 9 insertions(+), 12 deletions(-)
42d3218
42d3218
--- a/arjdata.c
42d3218
+++ b/arjdata.c
42d3218
@@ -204,13 +204,6 @@ void date_fmt(char *dest)
42d3218
  #endif
42d3218
 }
42d3218
 
42d3218
-/* A safe strcpy() */
42d3218
-
42d3218
-static void safe_strcpy(char *dest, char *src)
42d3218
-{
42d3218
- memmove(dest, src, strlen(src)+1);
42d3218
-}
42d3218
-
42d3218
 /* Context substitution routine */
42d3218
 
42d3218
 char *expand_tags(char *str, int limit)
42d3218
@@ -232,7 +225,7 @@ char *expand_tags(char *str, int limit)
42d3218
   {
42d3218
    if(*(p+1)==TAG_CHAR)
42d3218
    {
42d3218
-    strcpy(p, p+1);
42d3218
+    safe_strcpy(p, p+1);
42d3218
     p++;
42d3218
    }
42d3218
    else if(*(p+1)==TAG_SPECIAL_BEGIN&&(et=strchr(p+3, TAG_SPECIAL_END))!=NULL)
42d3218
--- a/arj.c
42d3218
+++ b/arj.c
42d3218
@@ -1169,7 +1169,7 @@ int main(int argc, char *argv[])
42d3218
      if(strlen(tmp_ptr)<=121)
42d3218
       tmp_ptr[0]='\0';
42d3218
      else if(tmp_ptr[120]==' ')
42d3218
-      strcpy(tmp_ptr, tmp_ptr+121);
42d3218
+      safe_strcpy(tmp_ptr, tmp_ptr+121);
42d3218
     }
42d3218
     if(cmd==ARJ_CMD_ORDER&&strpbrk(tmp_ptr, wildcard_pattern)!=NULL)
42d3218
      error(M_ORDER_WILDCARD);
42d3218
--- a/ea_mgr.c
42d3218
+++ b/ea_mgr.c
42d3218
@@ -696,7 +696,7 @@ int resolve_longname(char *dest, char *n
42d3218
     tmp_name[st_len]='\0';
42d3218
     if(tmp_name[0]==0xFD&&tmp_name[1]==0xFF)
42d3218
     {
42d3218
-     strcpy(tmp_name, (char *)tmp_name+4);
42d3218
+     safe_strcpy(tmp_name, (char *)tmp_name+4);
42d3218
      st_len-=4;
42d3218
     }
42d3218
     if(st_len==0||st_len+entry>=FILENAME_MAX)
42d3218
--- a/msgbind.c
42d3218
+++ b/msgbind.c
42d3218
@@ -578,7 +578,7 @@ int main(int argc, char **argv)
42d3218
    }
42d3218
    strcat(pool[tpool].data, msgname);
42d3218
    strcat(pool[tpool].data, ", ");
42d3218
-   strcpy(msg_buffer, msg_buffer+1);
42d3218
+   safe_strcpy(msg_buffer, msg_buffer+1);
42d3218
    buf_len=strlen(msg_buffer);
42d3218
    msg_buffer[--buf_len]='\0';
42d3218
    patch_string(msg_buffer);
42d3218
--- a/packager.c
42d3218
+++ b/packager.c
42d3218
@@ -347,7 +347,7 @@ int main(int argc, char **argv)
42d3218
  expand_tags(buf, sizeof(buf)-1);
42d3218
  if((p=strchr(buf, '.'))!=NULL)
42d3218
  {
42d3218
-  strcpy(p, p+1);
42d3218
+  safe_strcpy(p, p+1);
42d3218
   if((p=strchr(buf, '.'))!=NULL)
42d3218
    *p='\0';
42d3218
  }
42d3218
--- a/misc.h
42d3218
+++ b/misc.h
42d3218
@@ -11,6 +11,10 @@
42d3218
 #include "arjtypes.h"
42d3218
 #include "filelist.h"
42d3218
 
42d3218
+/* A safe strcpy() */
42d3218
+
42d3218
+#define safe_strcpy(dest, src) memmove(dest, src, strlen(src)+1);
42d3218
+
42d3218
 /* ASCIIZ string copy macro */
42d3218
 
42d3218
 #define strcpyn(dest, src, n)      \