Data corruption on file copying/moving fixed



Hello!

There was a data corruption possibility in the file.c:copy_file_file()
for a years. If mc_write() fails to write n_read bytes at once for some reason then n_read is fixed, but buf is not, so there are some pieces from beginning of buf instead of trailing part.

Possible scenario: copy/move file to some partition without enough space, remove some files to provide enough space and press "Retry".

Path commited.

--
Regards,
Andrew V. Samoilov
--- file.c~	Sun Dec 29 09:30:11 2002
+++ file.c	Wed Mar 26 11:11:23 2003
@@ -715,6 +715,7 @@ copy_file_file (FileOpContext *ctx, char
 	    gettimeofday (&tv_current, NULL);
 
 	    if (n_read > 0) {
+		char *t = buf;
 		n_read_total += n_read;
 
 		/* Windows NT ftp servers report that files have no
@@ -729,18 +730,18 @@ copy_file_file (FileOpContext *ctx, char
 
 		/* dst_write */
 		while ((n_written =
-			mc_write (dest_desc, buf, n_read)) < n_read) {
+			mc_write (dest_desc, t, n_read)) < n_read) {
 		    if (n_written > 0) {
 			n_read -= n_written;
+			t += n_written;
 			continue;
 		    }
 		    return_status =
 			file_error (_
 				    (" Cannot write target file \"%s\" \n %s "),
 				    dst_path);
-		    if (return_status == FILE_RETRY)
-			continue;
-		    goto ret;
+		    if (return_status != FILE_RETRY)
+			goto ret;
 		}
 	    }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]