mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-11 17:59:44 +00:00
Add helper API to write in a safer way
This commit is contained in:
parent
247f29ad47
commit
32ffdb2677
@ -2179,6 +2179,115 @@ fu_common_read_uint32_safe (const guint8 *buf,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_common_write_uint8_safe:
|
||||||
|
* @buf: source buffer
|
||||||
|
* @bufsz: maximum size of @buf, typically `sizeof(buf)`
|
||||||
|
* @offset: offset in bytes into @buf to write to
|
||||||
|
* @value: the value to write
|
||||||
|
* @error: A #GError or %NULL
|
||||||
|
*
|
||||||
|
* Write a value to a buffer in a safe way.
|
||||||
|
*
|
||||||
|
* You don't need to use this function in "obviously correct" cases, nor should
|
||||||
|
* you use it when performance is a concern. Only us it when you're not sure if
|
||||||
|
* malicious data from a device or firmware could cause memory corruption.
|
||||||
|
*
|
||||||
|
* Return value: %TRUE if @value was written, %FALSE otherwise
|
||||||
|
*
|
||||||
|
* Since: 1.5.8
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
fu_common_write_uint8_safe (guint8 *buf,
|
||||||
|
gsize bufsz,
|
||||||
|
gsize offset,
|
||||||
|
guint8 value,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (buf != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
|
return fu_memcpy_safe (buf, bufsz, offset, /* dst */
|
||||||
|
&value, sizeof(value), 0x0, /* src */
|
||||||
|
sizeof(value), error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_common_write_uint16_safe:
|
||||||
|
* @buf: source buffer
|
||||||
|
* @bufsz: maximum size of @buf, typically `sizeof(buf)`
|
||||||
|
* @offset: offset in bytes into @buf to write to
|
||||||
|
* @value: the value to write
|
||||||
|
* @endian: A #FuEndianType, e.g. %G_LITTLE_ENDIAN
|
||||||
|
* @error: A #GError or %NULL
|
||||||
|
*
|
||||||
|
* Write a value to a buffer using a specified endian in a safe way.
|
||||||
|
*
|
||||||
|
* You don't need to use this function in "obviously correct" cases, nor should
|
||||||
|
* you use it when performance is a concern. Only us it when you're not sure if
|
||||||
|
* malicious data from a device or firmware could cause memory corruption.
|
||||||
|
*
|
||||||
|
* Return value: %TRUE if @value was written, %FALSE otherwise
|
||||||
|
*
|
||||||
|
* Since: 1.5.8
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
fu_common_write_uint16_safe (guint8 *buf,
|
||||||
|
gsize bufsz,
|
||||||
|
gsize offset,
|
||||||
|
guint16 value,
|
||||||
|
FuEndianType endian,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
guint8 tmp[2] = { 0x0 };
|
||||||
|
|
||||||
|
g_return_val_if_fail (buf != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
|
fu_common_write_uint16 (tmp, value, endian);
|
||||||
|
return fu_memcpy_safe (buf, bufsz, offset, /* dst */
|
||||||
|
tmp, sizeof(tmp), 0x0, /* src */
|
||||||
|
sizeof(tmp), error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_common_write_uint32_safe:
|
||||||
|
* @buf: source buffer
|
||||||
|
* @bufsz: maximum size of @buf, typically `sizeof(buf)`
|
||||||
|
* @offset: offset in bytes into @buf to write to
|
||||||
|
* @value: the value to write
|
||||||
|
* @endian: A #FuEndianType, e.g. %G_LITTLE_ENDIAN
|
||||||
|
* @error: A #GError or %NULL
|
||||||
|
*
|
||||||
|
* Write a value to a buffer using a specified endian in a safe way.
|
||||||
|
*
|
||||||
|
* You don't need to use this function in "obviously correct" cases, nor should
|
||||||
|
* you use it when performance is a concern. Only us it when you're not sure if
|
||||||
|
* malicious data from a device or firmware could cause memory corruption.
|
||||||
|
*
|
||||||
|
* Return value: %TRUE if @value was written, %FALSE otherwise
|
||||||
|
*
|
||||||
|
* Since: 1.5.8
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
fu_common_write_uint32_safe (guint8 *buf,
|
||||||
|
gsize bufsz,
|
||||||
|
gsize offset,
|
||||||
|
guint32 value,
|
||||||
|
FuEndianType endian,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
guint8 tmp[4] = { 0x0 };
|
||||||
|
|
||||||
|
g_return_val_if_fail (buf != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
|
fu_common_write_uint32 (tmp, value, endian);
|
||||||
|
return fu_memcpy_safe (buf, bufsz, offset, /* dst */
|
||||||
|
tmp, sizeof(tmp), 0x0, /* src */
|
||||||
|
sizeof(tmp), error);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_byte_array_append_uint8:
|
* fu_byte_array_append_uint8:
|
||||||
* @array: A #GByteArray
|
* @array: A #GByteArray
|
||||||
|
@ -224,6 +224,26 @@ gboolean fu_common_read_uint32_safe (const guint8 *buf,
|
|||||||
FuEndianType endian,
|
FuEndianType endian,
|
||||||
GError **error)
|
GError **error)
|
||||||
G_GNUC_WARN_UNUSED_RESULT;
|
G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
gboolean fu_common_write_uint8_safe (guint8 *buf,
|
||||||
|
gsize bufsz,
|
||||||
|
gsize offset,
|
||||||
|
guint8 value,
|
||||||
|
GError **error)
|
||||||
|
G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
gboolean fu_common_write_uint16_safe (guint8 *buf,
|
||||||
|
gsize bufsz,
|
||||||
|
gsize offset,
|
||||||
|
guint16 value,
|
||||||
|
FuEndianType endian,
|
||||||
|
GError **error)
|
||||||
|
G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
gboolean fu_common_write_uint32_safe (guint8 *buf,
|
||||||
|
gsize bufsz,
|
||||||
|
gsize offset,
|
||||||
|
guint32 value,
|
||||||
|
FuEndianType endian,
|
||||||
|
GError **error)
|
||||||
|
G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
void fu_byte_array_set_size (GByteArray *array,
|
void fu_byte_array_set_size (GByteArray *array,
|
||||||
guint length);
|
guint length);
|
||||||
|
@ -775,6 +775,9 @@ LIBFWUPDPLUGIN_1.5.8 {
|
|||||||
global:
|
global:
|
||||||
fu_bluez_device_notify_start;
|
fu_bluez_device_notify_start;
|
||||||
fu_bluez_device_notify_stop;
|
fu_bluez_device_notify_stop;
|
||||||
|
fu_common_write_uint16_safe;
|
||||||
|
fu_common_write_uint32_safe;
|
||||||
|
fu_common_write_uint8_safe;
|
||||||
fu_device_get_backend_id;
|
fu_device_get_backend_id;
|
||||||
fu_device_set_backend_id;
|
fu_device_set_backend_id;
|
||||||
fu_plugin_add_possible_quirk_key;
|
fu_plugin_add_possible_quirk_key;
|
||||||
|
Loading…
Reference in New Issue
Block a user