summaryrefslogtreecommitdiffstats
path: root/source/ap/vim/patches/7.2.076
blob: 5166bbab2093a0a4c6784f5825ef9d0bbaea1989 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
To: vim-dev@vim.org
Subject: Patch 7.2.076
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 7.2.076
Problem:    rename(from, to) deletes the file if "from" and "to" are not equal
	    but still refer to the same file.  E.g., on a FAT32 filesystem
	    under Unix.
Solution:   Go through another file name.
Files:	    src/fileio.c


*** ../vim-7.2.075/src/fileio.c	Fri Nov 28 21:26:50 2008
--- src/fileio.c	Tue Dec 30 16:04:44 2008
***************
*** 6119,6124 ****
--- 6119,6165 ----
      if (mch_stat((char *)from, &st) < 0)
  	return -1;
  
+ #ifdef UNIX
+     {
+ 	struct stat	st_to;
+ 	char		tempname[MAXPATHL + 1];
+ 
+ 	/* It's possible for the source and destination to be the same file.
+ 	 * This happens when "from" and "to" differ in case and are on a FAT32
+ 	 * filesystem.  In that case go through a temp file name. */
+ 	if (mch_stat((char *)to, &st_to) >= 0
+ 		&& st.st_dev == st_to.st_dev
+ 		&& st.st_ino == st_to.st_ino)
+ 	{
+ 	    /* Find a name that doesn't exist and is in the same directory.
+ 	     * Move "from" to "tempname" and then to "to". */
+ 	    if (STRLEN(from) >= MAXPATHL - 5)
+ 		return -1;
+ 	    STRCPY(tempname, from);
+ 	    for (n = 123; n < 99999; ++n)
+ 	    {
+ 		sprintf(gettail(tempname), "%d", n);
+ 		if (mch_stat(tempname, &st_to) < 0)
+ 		{
+ 		    if (mch_rename((char *)from, tempname) == 0)
+ 		    {
+ 			if (mch_rename(tempname, (char *)to) == 0)
+ 			    return 0;
+ 			/* Strange, the second step failed.  Try moving the
+ 			 * file back and return failure. */
+ 			mch_rename(tempname, (char *)from);
+ 			return -1;
+ 		    }
+ 		    /* If it fails for one temp name it will most likely fail
+ 		     * for any temp name, give up. */
+ 		    return -1;
+ 		}
+ 	    }
+ 	    return -1;
+ 	}
+     }
+ #endif
+ 
      /*
       * Delete the "to" file, this is required on some systems to make the
       * mch_rename() work, on other systems it makes sure that we don't have
*** ../vim-7.2.075/src/version.c	Wed Dec 24 14:24:41 2008
--- src/version.c	Tue Dec 30 16:09:51 2008
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     76,
  /**/

-- 
FATAL ERROR! SYSTEM HALTED! - Press any key to continue doing nothing.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///