Skip to content
This repository was archived by the owner on Sep 4, 2024. It is now read-only.

Commit

Permalink
Use JsonSerializer instead of insecure BinaryFormatter in TransferDat…
Browse files Browse the repository at this point in the history
…aSource.
  • Loading branch information
sevoku committed Feb 16, 2023
1 parent 7b48e86 commit 327e01e
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 22 deletions.
2 changes: 1 addition & 1 deletion Xwt.Gtk/Xwt.GtkBackend/Util.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public static void SetSelectionData (Gtk.SelectionData data, string atomType, ob
data.SetUris(new string[] { ((Uri)val).AbsolutePath });
else {
var at = Gdk.Atom.Intern (atomType, false);
data.Set (at, 0, TransferDataSource.SerializeValue (val));
data.Set (at, 0, TransferDataSource.SerializeValue (val, val.GetType()));
}
}

Expand Down
2 changes: 1 addition & 1 deletion Xwt.WPF/Xwt.WPFBackend/DataConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ public static DataObject ToDataObject (this TransferDataSource data)
uris.Add (((Uri)value).LocalPath);
retval.SetFileDropList (uris);
} else
retval.SetData (type.Id, TransferDataSource.SerializeValue (value));
retval.SetData (type.Id, TransferDataSource.SerializeValue (value, value.GetType()));
}

return retval;
Expand Down
4 changes: 2 additions & 2 deletions Xwt.XamMac/Xwt.Mac/MacClipboardBackend.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public override object GetData (TransferDataType type)
var bytes = new byte [data.Length];
using (var stream = new UnmanagedMemoryStream ((byte*)data.Bytes, bytes.Length))
stream.Read (bytes, 0, bytes.Length);
return TransferDataSource.DeserializeValue (bytes);
return TransferDataSource.DeserializeValue (bytes, Type.GetType (type.Id));
}
}

Expand Down Expand Up @@ -121,7 +121,7 @@ public void ProvideData (NSPasteboard pboard, NSString type)
else if (obj is string)
data = NSData.FromString ((string)obj);
else
data = NSData.FromArray (TransferDataSource.SerializeValue (obj));
data = NSData.FromArray (TransferDataSource.SerializeValue (obj, obj.GetType()));
pboard.SetDataForType (data, type);
}
}
Expand Down
2 changes: 1 addition & 1 deletion Xwt.XamMac/Xwt.Mac/ViewBackend.cs
Original file line number Diff line number Diff line change
Expand Up @@ -968,7 +968,7 @@ public void ProvideDataForType (NSPasteboard pasteboard, NSPasteboardItem item,
else {
// For internal types, provided serialized data
object value = dataSource.GetValue(transferDataType);
NSData serializedData = NSData.FromArray(TransferDataSource.SerializeValue(value));
NSData serializedData = NSData.FromArray(TransferDataSource.SerializeValue(value, value.GetType()));
pasteboard.SetDataForType(serializedData, type);
}
}
Expand Down
4 changes: 2 additions & 2 deletions Xwt/Xwt.Backends/TransferDataStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public void AddValue (TransferDataType type, byte[] value)
{
Type t = Type.GetType (type.Id);
if (t != null)
data [type] = TransferDataSource.DeserializeValue (value);
data [type] = TransferDataSource.DeserializeValue (value, t);
else
data [type] = value;
}
Expand Down Expand Up @@ -119,7 +119,7 @@ T ITransferData.GetValue<T> ()
if (ob == null || ob.GetType () == typeof(Type))
return (T) ob;
if (ob is byte[]) {
T val = (T) TransferDataSource.DeserializeValue ((byte[])ob);
T val = (T) TransferDataSource.DeserializeValue ((byte[])ob, typeof(T));
data[TransferDataType.FromType (typeof(T))] = val;
return val;
}
Expand Down
3 changes: 3 additions & 0 deletions Xwt/Xwt.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ The framework consists of the frontend (Xwt core) and platform specific backends
<None Include="..\LICENSE.txt" Pack="true" PackagePath="" />
<None Include="..\README.markdown" Pack="true" PackagePath="" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="7.0.2" />
</ItemGroup>
<ProjectExtensions>
<MonoDevelop>
<Properties>
Expand Down
23 changes: 8 additions & 15 deletions Xwt/Xwt/TransferDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
using System.Runtime.Serialization.Formatters.Binary;
using Xwt.Drawing;
using Xwt.Backends;

using System.Text.Json;

namespace Xwt
{
Expand Down Expand Up @@ -138,32 +138,25 @@ public object GetValue (TransferDataType type)
}
return null;
}

/// <summary>
/// Serializes a value to a byte array using <see cref="System.Runtime.Serialization.Formatters.Binary.BinaryFormatter"/> .
/// Serializes a value to a byte array using <see cref="System.Text.Json.JsonSerializer"/> .
/// </summary>
/// <returns>The serialized value.</returns>
/// <param name="val">The value to serialize.</param>
public static byte[] SerializeValue (object val)
public static byte[] SerializeValue (object val, Type type)
{
using (MemoryStream ms = new MemoryStream ()) {
BinaryFormatter bf = new BinaryFormatter ();
bf.Serialize (ms, val);
return ms.ToArray ();
}
return JsonSerializer.SerializeToUtf8Bytes (val, type);
}

/// <summary>
/// Deserializes a value from a byte array.
/// </summary>
/// <returns>The deserialized value.</returns>
/// <param name="data">The byte array containing the serialized value.</param>
public static object DeserializeValue (byte[] data)
/// <param name="data">The byte array containing the Utf8 Json serialized value.</param>
public static object DeserializeValue (byte[] data, Type type)
{
using (MemoryStream ms = new MemoryStream (data)) {
BinaryFormatter bf = new BinaryFormatter ();
return bf.Deserialize (ms);
}
return JsonSerializer.Deserialize (data, type);
}
}

Expand Down

0 comments on commit 327e01e

Please sign in to comment.