Permalink
Browse files

Backport commits from upstream to fix problems on big endian

  • Loading branch information...
1 parent 03685dd commit 2056ddb50b4257936ef1bee89ab4442e8e4fe9c6 @superm1 committed Apr 3, 2016
Showing with 185 additions and 0 deletions.
  1. +184 −0 debian/patches/endian_fix.patch
  2. +1 −0 debian/patches/series
@@ -0,0 +1,184 @@
+Index: fwupd/libdfu/dfu-firmware.c
+===================================================================
+--- fwupd.orig/libdfu/dfu-firmware.c 2016-04-03 09:27:07.141061146 -0500
++++ fwupd/libdfu/dfu-firmware.c 2016-04-03 09:27:26.089061053 -0500
+@@ -842,7 +842,7 @@
+ prefix = (DfuSePrefix *) buf;
+ memcpy (prefix->sig, "DfuSe", 5);
+ prefix->ver = 0x01;
+- prefix->image_size = offset + image_size_total;
++ prefix->image_size = GUINT32_TO_LE (offset + image_size_total);
+ prefix->targets = priv->images->len;
+
+ /* copy images */
+@@ -877,7 +877,7 @@
+ dfu_firmware_parse_metadata (DfuFirmware *firmware,
+ const guint8 *data,
+ guint data_length,
+- guint32 footer_size,
++ guint8 footer_size,
+ GError **error)
+ {
+ guint i;
+@@ -965,7 +965,6 @@
+ const gchar *cipher_str;
+ gsize len;
+ guint32 crc_new;
+- guint32 size;
+ guint8 *data;
+ g_autoptr(GBytes) contents = NULL;
+
+@@ -974,7 +973,8 @@
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ /* sanity check */
+- g_assert_cmpint(sizeof(DfuSePrefix), ==, 11);
++ g_assert_cmpint (sizeof(DfuFirmwareFooter), ==, 16);
++ g_assert_cmpint (sizeof(DfuSePrefix), ==, 11);
+
+ /* set defaults */
+ priv->vid = 0xffff;
+@@ -993,7 +993,7 @@
+ }
+
+ /* check for DFU signature */
+- ftr = (DfuFirmwareFooter *) &data[len-sizeof(DfuFirmwareFooter)];
++ ftr = (DfuFirmwareFooter *) &data[len - sizeof(DfuFirmwareFooter)];
+ if (memcmp (ftr->sig, "UFD", 3) != 0) {
+ priv->format = DFU_FIRMWARE_FORMAT_RAW;
+ return dfu_firmware_add_binary (firmware, bytes, error);
+@@ -1033,19 +1033,18 @@
+ dfu_firmware_set_release (firmware, GUINT16_FROM_LE (ftr->release));
+
+ /* check reported length */
+- size = GUINT16_FROM_LE (ftr->len);
+- if (size > len) {
++ if (ftr->len > len) {
+ g_set_error (error,
+ DFU_ERROR,
+ DFU_ERROR_INTERNAL,
+ "reported firmware size %04x larger than file %04x",
+- (guint) size, (guint) len);
++ (guint) ftr->len, (guint) len);
+ return FALSE;
+ }
+
+ /* parse the optional metadata segment */
+ if ((flags & DFU_FIRMWARE_PARSE_FLAG_NO_METADATA) == 0) {
+- if (!dfu_firmware_parse_metadata (firmware, data, len, size, error))
++ if (!dfu_firmware_parse_metadata (firmware, data, len, ftr->len, error))
+ return FALSE;
+ }
+
+@@ -1059,7 +1058,7 @@
+ }
+
+ /* parse DfuSe prefix */
+- contents = g_bytes_new_from_bytes (bytes, 0, len - size);
++ contents = g_bytes_new_from_bytes (bytes, 0, len - ftr->len);
+ if (priv->format == DFU_FIRMWARE_FORMAT_DFUSE)
+ return dfu_firmware_add_dfuse (firmware, contents, error);
+
+@@ -1258,6 +1257,7 @@
+ const guint8 *data_md;
+ gsize length_bin = 0;
+ gsize length_md = 0;
++ guint32 crc_new;
+ guint8 *buf;
+ g_autoptr(GBytes) metadata_table = NULL;
+
+@@ -1281,9 +1281,10 @@
+ ftr->pid = GUINT16_TO_LE (priv->pid);
+ ftr->vid = GUINT16_TO_LE (priv->vid);
+ ftr->ver = GUINT16_TO_LE (priv->format);
+- ftr->len = GUINT16_TO_LE (0x10 + length_md);
++ ftr->len = sizeof (DfuFirmwareFooter) + length_md;
+ memcpy(ftr->sig, "UFD", 3);
+- ftr->crc = dfu_firmware_generate_crc32 (buf, length_bin + length_md + 12);
++ crc_new = dfu_firmware_generate_crc32 (buf, length_bin + length_md + 12);
++ ftr->crc = GUINT32_TO_LE (crc_new);
+
+ /* return all data */
+ return g_bytes_new_take (buf, length_bin + length_md + 0x10);
+Index: fwupd/libdfu/dfu-image.c
+===================================================================
+--- fwupd.orig/libdfu/dfu-image.c 2016-04-03 09:27:07.141061146 -0500
++++ fwupd/libdfu/dfu-image.c 2016-04-03 09:27:26.089061053 -0500
+@@ -147,6 +147,26 @@
+ }
+
+ /**
++ * dfu_image_get_element_default:
++ * @image: a #DfuImage
++ *
++ * Gets the default element.
++ *
++ * Return value: (transfer none): element data, or %NULL for invalid
++ *
++ * Since: 0.7.1
++ **/
++DfuElement *
++dfu_image_get_element_default (DfuImage *image)
++{
++ DfuImagePrivate *priv = GET_PRIVATE (image);
++ g_return_val_if_fail (DFU_IS_IMAGE (image), NULL);
++ if (priv->elements->len == 0)
++ return NULL;
++ return g_ptr_array_index (priv->elements, 0);
++}
++
++/**
+ * dfu_image_get_alt_setting:
+ * @image: a #DfuImage
+ *
+@@ -336,6 +356,7 @@
+ {
+ DfuImagePrivate *priv;
+ DfuSeImagePrefix *im;
++ guint32 elements;
+ guint32 offset = sizeof(DfuSeImagePrefix);
+ guint j;
+ g_autoptr(DfuImage) image = NULL;
+@@ -366,12 +387,13 @@
+ image = dfu_image_new ();
+ priv = GET_PRIVATE (image);
+ priv->alt_setting = im->alt_setting;
+- if (im->target_named == 0x01)
++ if (GUINT32_FROM_LE (im->target_named) == 0x01)
+ memcpy (priv->name, im->target_name, 255);
+
+ /* parse elements */
+ length -= offset;
+- for (j = 0; j < im->elements; j++) {
++ elements = GUINT32_FROM_LE (im->elements);
++ for (j = 0; j < elements; j++) {
+ guint32 consumed_local;
+ g_autoptr(DfuElement) element = NULL;
+ element = dfu_element_from_dfuse (data + offset, length,
+@@ -426,11 +448,11 @@
+ memcpy (im->sig, "Target", 6);
+ im->alt_setting = priv->alt_setting;
+ if (priv->name != NULL) {
+- im->target_named = 0x01;
++ im->target_named = GUINT32_TO_LE (0x01);
+ memcpy (im->target_name, priv->name, 255);
+ }
+- im->target_size = length_total;
+- im->elements = priv->elements->len;
++ im->target_size = GUINT32_TO_LE (length_total);
++ im->elements = GUINT32_TO_LE (priv->elements->len);
+
+ /* copy data */
+ for (i = 0; i < element_array->len; i++) {
+Index: fwupd/libdfu/dfu-image.h
+===================================================================
+--- fwupd.orig/libdfu/dfu-image.h 2016-04-03 09:27:07.141061146 -0500
++++ fwupd/libdfu/dfu-image.h 2016-04-03 09:27:26.089061053 -0500
+@@ -53,6 +53,7 @@
+ GPtrArray *dfu_image_get_elements (DfuImage *image);
+ DfuElement *dfu_image_get_element (DfuImage *image,
+ guint8 idx);
++DfuElement *dfu_image_get_element_default (DfuImage *image);
+ guint8 dfu_image_get_alt_setting (DfuImage *image);
+ const gchar *dfu_image_get_name (DfuImage *image);
+ guint32 dfu_image_get_size (DfuImage *image);
View
@@ -1 +1,2 @@
polkit_rule_fixes.patch
+endian_fix.patch

0 comments on commit 2056ddb

Please sign in to comment.