Permalink
Please sign in to comment.
Browse files
Backport commits from upstream to fix problems on big endian
- Loading branch information...
Showing
with
185 additions
and 0 deletions.
- +184 −0 debian/patches/endian_fix.patch
- +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); |
| @@ -1 +1,2 @@ | ||
| polkit_rule_fixes.patch | ||
| +endian_fix.patch |
0 comments on commit
2056ddb