enclink: check contents of symlinks not just size in case of fcrypt stable
authorCorey Schuhen <cschuhen@topcon.com>
Wed, 10 Mar 2021 15:24:52 +1000
branchstable
changeset 46678 0d055849d5f9
parent 46574 ed3fb1ae5ab1
child 46679 d6fa9fbd375d
enclink: check contents of symlinks not just size in case of fcrypt Check content of symlinks because st_size may indicate the size of encrypted data which does not match actual link value. Differential Revision: https://phab.mercurial-scm.org/D10146
mercurial/context.py
mercurial/dirstate.py
--- a/mercurial/context.py	Tue Mar 09 11:19:11 2021 +0530
+++ b/mercurial/context.py	Wed Mar 10 15:24:52 2021 +1000
@@ -993,8 +993,10 @@
                 # if file data starts with '\1\n', empty metadata block is
                 # prepended, which adds 4 bytes to filelog.size().
                 return self._filelog.cmp(self._filenode, fctx.data())
-        if self.size() == fctx.size():
+        if self.size() == fctx.size() or self.flags() == b'l':
             # size() matches: need to compare content
+            # issue6456: Always compare symlinks because size can represent
+            # encrypted string for EXT-4 encryption(fscrypt).
             return self._filelog.cmp(self._filenode, fctx.data())
 
         # size() differs
--- a/mercurial/dirstate.py	Tue Mar 09 11:19:11 2021 +0530
+++ b/mercurial/dirstate.py	Wed Mar 10 15:24:52 2021 +1000
@@ -1279,7 +1279,12 @@
                     or size == -2  # other parent
                     or fn in copymap
                 ):
-                    madd(fn)
+                    if (stat.S_ISLNK(st.st_mode) and size != st.st_size):
+                        # issue6456: Size returned may be longer due to
+                        # encryption on EXT-4 fscrypt, undecided.
+                        ladd(fn)
+                    else:
+                        madd(fn)
                 elif (
                     time != st[stat.ST_MTIME]
                     and time != st[stat.ST_MTIME] & _rangemask