- added some notes about encryption and authentication to the man
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index 9d3b1c5..98af1cd 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -111,7 +111,7 @@ static int delete_file(char *fname)
                if (strcmp(dname,".")==0 ||
                    strcmp(dname,"..")==0)
                        continue;
-               strncpy(buf, fname, (MAXPATHLEN-strlen(dname))-2);
+               strlcpy(buf, fname, (MAXPATHLEN-strlen(dname))-2);
                strcat(buf, "/");
                strcat(buf, dname);
                buf[MAXPATHLEN-1] = 0;
@@ -818,12 +818,6 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
       }
 
       /* open tmp file */
-      if (strlen(fname) > (MAXPATHLEN-8)) {
-       rprintf(FERROR,"filename too long\n");
-       if (buf) unmap_file(buf);
-       close(fd1);
-       continue;
-      }
       if (tmpdir) {
              char *f;
              f = strrchr(fname,'/');
@@ -831,9 +825,30 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                      f = fname;
              else 
                      f++;
-             sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
+             if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
+                     rprintf(FERROR,"filename too long\n");
+                     if (buf) unmap_file(buf);
+                     close(fd1);
+                     continue;
+             }
+             sprintf(fnametmp,"%s/.%s.XXXXXX",tmpdir,f);
       } else {
-             sprintf(fnametmp,"%s.XXXXXX",fname);
+             char *f = strrchr(fname,'/');
+
+             if (strlen(fname)+9 > MAXPATHLEN) {
+                     rprintf(FERROR,"filename too long\n");
+                     if (buf) unmap_file(buf);
+                     close(fd1);
+                     continue;
+             }
+
+             if (f) {
+                     *f = 0;
+                     sprintf(fnametmp,"%s/.%s.XXXXXX",fname,f+1);
+                     *f = '/';
+             } else {
+                     sprintf(fnametmp,".%s.XXXXXX",fname);
+             }
       }
       if (NULL == do_mktemp(fnametmp)) {
        rprintf(FERROR,"mktemp %s failed\n",fnametmp);
@@ -976,8 +991,7 @@ void send_files(struct file_list *flist,int f_out,int f_in)
 
          fname[0] = 0;
          if (file->basedir) {
-                 strncpy(fname,file->basedir,MAXPATHLEN-1);
-                 fname[MAXPATHLEN-1] = 0;
+                 strlcpy(fname,file->basedir,MAXPATHLEN-1);
                  if (strlen(fname) == MAXPATHLEN-1) {
                          io_error = 1;
                          rprintf(FERROR, "send_files failed on long-named directory %s\n",