[FarGroup/FarManager] master: Refactoring (ef423096c)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
Jun 11, 2026, 2:30:53 PM (6 days ago) Jun 11
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/ef423096c4048523421a66dc2b77b1549d0188d1

>---------------------------------------------------------------

commit ef423096c4048523421a66dc2b77b1549d0188d1
Author: Alex Alabuzhev <alab...@gmail.com>
Date: Thu Jun 11 19:24:15 2026 +0100

Refactoring


>---------------------------------------------------------------

ef423096c4048523421a66dc2b77b1549d0188d1
far/changelog | 5 +++++
far/flink.cpp | 47 ++++++++++++++++++++++++++---------------------
far/flink.hpp | 2 +-
far/setattr.cpp | 5 +++--
far/vbuild.m4 | 2 +-
5 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/far/changelog b/far/changelog
index 75aea9106..035d58252 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+drkns 2026-06-11 19:24:01+01:00 - build 6697
+
+1. Refactoring.
+
--------------------------------------------------------------------------------
drkns 2026-06-10 22:09:06+01:00 - build 6696

diff --git a/far/flink.cpp b/far/flink.cpp
index 21a07e287..2e22df2f7 100644
--- a/far/flink.cpp
+++ b/far/flink.cpp
@@ -351,7 +351,7 @@ bool DeleteReparsePoint(string_view const Object)
return fObject.IoControl(FSCTL_DELETE_REPARSE_POINT, &rgdb, REPARSE_GUID_DATA_BUFFER_HEADER_SIZE, nullptr, 0);
}

-bool GetReparsePointInfo(string_view const Object, string& DestBuffer, LPDWORD ReparseTag)
+bool GetReparsePointInfo(string_view const Object, string& DestBuffer, DWORD* ReparseTag, bool* IsEditable)
{
const block_ptr<REPARSE_DATA_BUFFER> rdb(MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
if (!GetREPARSE_DATA_BUFFER(Object, *rdb))
@@ -360,35 +360,35 @@ bool GetReparsePointInfo(string_view const Object, string& DestBuffer, LPDWORD R
if (ReparseTag)
*ReparseTag=rdb->ReparseTag;

- const auto Extract = [&](const auto& Buffer)
+ const auto Extract = [&]<typename T>(const T& Buffer)
{
+ if (rdb->ReparseDataLength < offsetof(T, PathBuffer))
+ return false;
+
+ if (IsEditable)
+ *IsEditable = true;
+
if (const auto NameLength = Buffer.PrintNameLength / sizeof(wchar_t))
{
DestBuffer.assign(Buffer.PathBuffer + Buffer.PrintNameOffset / sizeof(wchar_t), NameLength);
return true;
}

- if (const auto NameLength = Buffer.SubstituteNameLength / sizeof(wchar_t))
- {
- DestBuffer.assign(Buffer.PathBuffer + Buffer.SubstituteNameOffset / sizeof(wchar_t), NameLength);
- return true;
- }
-
- return false;
+ DestBuffer.assign(Buffer.PathBuffer + Buffer.SubstituteNameOffset / sizeof(wchar_t), Buffer.SubstituteNameLength / sizeof(wchar_t));
+ return true;
};

switch (rdb->ReparseTag)
{
+ // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/b41f1cbf-10df-4a47-98d4-1c52a833d913
case IO_REPARSE_TAG_SYMLINK:
- if (rdb->ReparseDataLength < sizeof(rdb->SymbolicLinkReparseBuffer))
- return false;
return Extract(rdb->SymbolicLinkReparseBuffer);

+ // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/ca069dad-ed16-42aa-b057-b6b207f447cc
case IO_REPARSE_TAG_MOUNT_POINT:
- if (rdb->ReparseDataLength < sizeof(rdb->MountPointReparseBuffer))
- return false;
return Extract(rdb->MountPointReparseBuffer);

+ // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/ff4df658-7f27-476a-8025-4074c0121eec
case IO_REPARSE_TAG_NFS:
{
constexpr auto NFS_SPECFILE_LNK = 0x014B4E4C;
@@ -399,14 +399,15 @@ bool GetReparsePointInfo(string_view const Object, string& DestBuffer, LPDWORD R
WCHAR DataBuffer[1];
};

- if (rdb->ReparseDataLength < sizeof(NFS_REPARSE_DATA_BUFFER))
+ const auto DataOffset = offsetof(NFS_REPARSE_DATA_BUFFER, DataBuffer);
+ if (rdb->ReparseDataLength < DataOffset)
return false;

const auto& NfsReparseBuffer = view_as<NFS_REPARSE_DATA_BUFFER>(rdb->GenericReparseBuffer.DataBuffer);
if (NfsReparseBuffer.Type != NFS_SPECFILE_LNK)
return false;

- DestBuffer.assign(NfsReparseBuffer.DataBuffer, (rdb->ReparseDataLength - sizeof(NfsReparseBuffer.Type)) / sizeof(wchar_t));
+ DestBuffer.assign(NfsReparseBuffer.DataBuffer, (rdb->ReparseDataLength - DataOffset) / sizeof(wchar_t));
return true;
}

@@ -422,13 +423,14 @@ bool GetReparsePointInfo(string_view const Object, string& DestBuffer, LPDWORD R
WCHAR StringList[1];
};

- if (rdb->ReparseDataLength < sizeof(APPEXECLINK_REPARSE_DATA_BUFFER))
+ const auto DataOffset = offsetof(APPEXECLINK_REPARSE_DATA_BUFFER, StringList);
+ if (rdb->ReparseDataLength < DataOffset)
return false;

const auto& AppExecLinkReparseBuffer = view_as<APPEXECLINK_REPARSE_DATA_BUFFER>(rdb->GenericReparseBuffer.DataBuffer);

size_t Index = 0;
- const auto StringSize = (rdb->ReparseDataLength - sizeof(AppExecLinkReparseBuffer.Version)) / sizeof(*AppExecLinkReparseBuffer.StringList);
+ const auto StringSize = (rdb->ReparseDataLength - DataOffset) / sizeof(*AppExecLinkReparseBuffer.StringList);
string_view const StringList{ AppExecLinkReparseBuffer.StringList, StringSize };

for (const auto& i: enum_substrings(StringList))
@@ -445,19 +447,21 @@ bool GetReparsePointInfo(string_view const Object, string& DestBuffer, LPDWORD R
return false;
}

+ // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/68337353-9153-4ee1-ac6b-419839c3b7ad
case IO_REPARSE_TAG_LX_SYMLINK:
{
struct LX_SYMLINK_REPARSE_DATA_BUFFER
{
- DWORD FileType;
+ DWORD Version;
char PathBuffer[1];
};

- if (rdb->ReparseDataLength < sizeof(LX_SYMLINK_REPARSE_DATA_BUFFER))
+ const auto DataOffset = offsetof(LX_SYMLINK_REPARSE_DATA_BUFFER, PathBuffer);
+ if (rdb->ReparseDataLength < DataOffset)
return false;

const auto& LxSymlinkReparseBuffer = view_as<LX_SYMLINK_REPARSE_DATA_BUFFER>(rdb->GenericReparseBuffer.DataBuffer);
- DestBuffer = encoding::utf8::get_chars({ LxSymlinkReparseBuffer.PathBuffer, rdb->ReparseDataLength - sizeof(LxSymlinkReparseBuffer.FileType) });
+ DestBuffer = encoding::utf8::get_chars({ LxSymlinkReparseBuffer.PathBuffer, rdb->ReparseDataLength - DataOffset });
return true;
}

@@ -475,7 +479,8 @@ bool GetReparsePointInfo(string_view const Object, string& DestBuffer, LPDWORD R
WCHAR WciName[1];
};

- if (rdb->ReparseDataLength < sizeof(WCI_REPARSE_DATA_BUFFER))
+ const auto DataOffset = offsetof(WCI_REPARSE_DATA_BUFFER, WciName);
+ if (rdb->ReparseDataLength < DataOffset)
return false;

const auto& WciReparseBuffer = view_as<WCI_REPARSE_DATA_BUFFER>(rdb->GenericReparseBuffer.DataBuffer);
diff --git a/far/flink.hpp b/far/flink.hpp
index aa406ef7c..429359cd2 100644
--- a/far/flink.hpp
+++ b/far/flink.hpp
@@ -67,7 +67,7 @@ bool CreateReparsePoint(string_view Target, string_view Object, ReparsePointType
bool DeleteReparsePoint(string_view Object);
bool ModifyReparsePoint(string_view Object, string_view Target);

-bool GetReparsePointInfo(string_view Object, string &DestBuffer,LPDWORD ReparseTag=nullptr);
+bool GetReparsePointInfo(string_view Object, string& DestBuffer, DWORD* ReparseTag = {}, bool* IsEditable = {});

bool GetSubstName(int DriveType, string_view Path, string& strTargetPath);
bool GetVHDInfo(string_view RootDirectory, string &strVolumePath, VIRTUAL_STORAGE_TYPE* StorageType = nullptr);
diff --git a/far/setattr.cpp b/far/setattr.cpp
index 952cdfdc2..1f935871d 100644
--- a/far/setattr.cpp
+++ b/far/setattr.cpp
@@ -1070,6 +1070,7 @@ static bool ShellSetFileAttributesImpl(Panel* SrcPanel, const string* Object)
auto ID_Msg = IsMountPoint? lng::MSetAttrVolMount : lng::MSetAttrSymlink;
DWORD ReparseTag = SingleSelFindData.ReparseTag;
bool KnownReparseTag = false;
+ bool IsEditableReparsePoint = false;

if (!DlgParam.Plugin)
{
@@ -1082,7 +1083,7 @@ static bool ShellSetFileAttributesImpl(Panel* SrcPanel, const string* Object)
else
{
DWORD ReparseTagAlternative = 0;
- KnownReparseTag = GetReparsePointInfo(SingleSelFileName, strLinkName, &ReparseTagAlternative);
+ KnownReparseTag = GetReparsePointInfo(SingleSelFileName, strLinkName, &ReparseTagAlternative, &IsEditableReparsePoint);
if (ReparseTagAlternative && !ReparseTag)
{
ReparseTag = ReparseTagAlternative;
@@ -1183,7 +1184,7 @@ static bool ShellSetFileAttributesImpl(Panel* SrcPanel, const string* Object)
AttrDlg[SA_EDIT_REPARSE_POINT].strData = strLinkName;
}

- if (IsMountPoint || none_of(ReparseTag, IO_REPARSE_TAG_MOUNT_POINT, IO_REPARSE_TAG_SYMLINK, IO_REPARSE_TAG_APPEXECLINK))
+ if (IsMountPoint || !IsEditableReparsePoint)
AttrDlg[SA_EDIT_REPARSE_POINT].Flags |= DIF_READONLY;
}
else
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index e138ab38a..59c887495 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-6696
+6697


Reply all
Reply to author
Forward
0 new messages