fix(asar): correct archive tree lookups and fail loudly on unreadable input

InsertFile resolved the grandparent node instead of the parent.
Reads no longer create phantom directories in the header.
Bound symlink traversal and skip reparse points when crawling.
Locked or unreadable files now abort packing instead of being dropped.
Read headers and integrity blocks with a full-read loop.
Assert the header keeps its size before overwriting the placeholder.
Validate Pickle buffer sizes, payload overflow and negative lengths.
Check CreateSymbolicLink and external tool exit codes.
Drop unused Pickle accessors, TransformedFile and FilesystemFilesAndLinks.Links.
This commit is contained in:
kitbyte
2026-08-29 16:55:55 +03:00
parent f798714f8d
commit 20956c3228
9 changed files with 163 additions and 245 deletions
+2 -23
View File
@@ -18,10 +18,7 @@ namespace AsarSharp.PickleTools
_endIndex = pickle.GetPayloadSize();
}
public bool ReadBool()
{
return ReadInt() != 0;
}
public int ReadInt()
{
@@ -33,25 +30,7 @@ namespace AsarSharp.PickleTools
return ReadBytes(Pickle.SIZE_UINT32, BitConverter.ToUInt32);
}
public long ReadInt64()
{
return ReadBytes(Pickle.SIZE_INT64, BitConverter.ToInt64);
}
public ulong ReadUInt64()
{
return ReadBytes(Pickle.SIZE_UINT64, BitConverter.ToUInt64);
}
public float ReadFloat()
{
return ReadBytes(Pickle.SIZE_FLOAT, BitConverter.ToSingle);
}
public double ReadDouble()
{
return ReadBytes(Pickle.SIZE_DOUBLE, BitConverter.ToDouble);
}
public string ReadString()
{
@@ -75,7 +54,7 @@ namespace AsarSharp.PickleTools
private int GetReadPayloadOffsetAndAdvance(int length)
{
if (length > _endIndex - _readIndex)
if (length < 0 || length > _endIndex - _readIndex)
{
_readIndex = _endIndex;
throw new InvalidOperationException($"Failed to read data with length of {length}");