summaryrefslogtreecommitdiff
path: root/gnu/packages/patches
diff options
context:
space:
mode:
authorMarius Bakke <mbakke@fastmail.com>2016-12-04 17:41:36 +0100
committerMarius Bakke <mbakke@fastmail.com>2016-12-04 17:41:36 +0100
commita351fc83694f436c3bff7cbdef09bd3cc91c74fc (patch)
tree646145378742a6943d7c4dda995fc0fb67f9db32 /gnu/packages/patches
parent80b63e670ef4fe1fd40a903bcd4ee47a11415bd9 (diff)
parentd1a5b20081c30da7503201df260cf20b8d0ba633 (diff)
Merge branch 'master' into staging
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r--gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch14
-rw-r--r--gnu/packages/patches/fcgi-2.4.0-poll.patch89
-rw-r--r--gnu/packages/patches/gst-plugins-good-fix-crashes.patch1047
-rw-r--r--gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch37
-rw-r--r--gnu/packages/patches/gst-plugins-good-fix-signedness.patch58
-rw-r--r--gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch319
-rw-r--r--gnu/packages/patches/icecat-CVE-2016-9064.patch996
-rw-r--r--gnu/packages/patches/nasm-no-ps-pdf.patch20
-rw-r--r--gnu/packages/patches/netcdf-config-date.patch47
-rw-r--r--gnu/packages/patches/netcdf-date-time.patch11
-rw-r--r--gnu/packages/patches/netcdf-tst_h_par.patch21
-rw-r--r--gnu/packages/patches/vtk-mesa-10.patch36
12 files changed, 135 insertions, 2560 deletions
diff --git a/gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch b/gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch
new file mode 100644
index 0000000000..0f921b120b
--- /dev/null
+++ b/gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch
@@ -0,0 +1,14 @@
+Taken from http://pkgs.fedoraproject.org/cgit/rpms/fcgi.git/plain/fcgi-2.4.0-gcc44_fixes.patch.
+Fixes compilation with GCC 4.4 and later.
+
+diff -up fcgi-2.4.0/libfcgi/fcgio.cpp.gcc44_fixes fcgi-2.4.0/libfcgi/fcgio.cpp
+--- fcgi-2.4.0/libfcgi/fcgio.cpp.gcc44_fixes 2002-02-24 21:12:22.000000000 +0100
++++ fcgi-2.4.0/libfcgi/fcgio.cpp 2009-02-15 11:35:18.000000000 +0100
+@@ -23,6 +23,7 @@
+ #endif
+
+ #include <limits.h>
++#include <cstdio>
+ #include "fcgio.h"
+
+ using std::streambuf;
diff --git a/gnu/packages/patches/fcgi-2.4.0-poll.patch b/gnu/packages/patches/fcgi-2.4.0-poll.patch
new file mode 100644
index 0000000000..73be6a0a08
--- /dev/null
+++ b/gnu/packages/patches/fcgi-2.4.0-poll.patch
@@ -0,0 +1,89 @@
+Taken from http://pkgs.fedoraproject.org/cgit/rpms/fcgi.git/plain/fcgi-2.4.0-poll.patch
+Fixes CVE-2012-6687.
+
+Author: Anton Kortunov <toshic.toshic@gmail.com>
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libfcgi/+bug/933417
+Description: use poll in os_unix.c instead of select to avoid problem with > 1024 connections
+Forwarded: yes, fastcgi-developers@mailman.fastcgi.com
+
+diff --git a/libfcgi/os_unix.c b/libfcgi/os_unix.c
+index 73e6a7f..af35aee 100755
+--- a/libfcgi/os_unix.c
++++ b/libfcgi/os_unix.c
+@@ -42,6 +42,7 @@ static const char rcsid[] = "$Id: os_unix.c,v 1.37 2002/03/05 19:14:49 robs Exp
+ #include <sys/time.h>
+ #include <sys/un.h>
+ #include <signal.h>
++#include <poll.h>
+
+ #ifdef HAVE_NETDB_H
+ #include <netdb.h>
+@@ -103,6 +104,9 @@ static int volatile maxFd = -1;
+ static int shutdownPending = FALSE;
+ static int shutdownNow = FALSE;
+
++static int libfcgiOsClosePollTimeout = 2000;
++static int libfcgiIsAfUnixKeeperPollTimeout = 2000;
++
+ void OS_ShutdownPending()
+ {
+ shutdownPending = TRUE;
+@@ -168,6 +172,16 @@ int OS_LibInit(int stdioFds[3])
+ if(libInitialized)
+ return 0;
+
++ char *libfcgiOsClosePollTimeoutStr = getenv( "LIBFCGI_OS_CLOSE_POLL_TIMEOUT" );
++ if(libfcgiOsClosePollTimeoutStr) {
++ libfcgiOsClosePollTimeout = atoi(libfcgiOsClosePollTimeoutStr);
++ }
++
++ char *libfcgiIsAfUnixKeeperPollTimeoutStr = getenv( "LIBFCGI_IS_AF_UNIX_KEEPER_POLL_TIMEOUT" );
++ if(libfcgiIsAfUnixKeeperPollTimeoutStr) {
++ libfcgiIsAfUnixKeeperPollTimeout = atoi(libfcgiIsAfUnixKeeperPollTimeoutStr);
++ }
++
+ asyncIoTable = (AioInfo *)malloc(asyncIoTableSize * sizeof(AioInfo));
+ if(asyncIoTable == NULL) {
+ errno = ENOMEM;
+@@ -755,19 +769,16 @@ int OS_Close(int fd)
+
+ if (shutdown(fd, 1) == 0)
+ {
+- struct timeval tv;
+- fd_set rfds;
++ struct pollfd pfd;
+ int rv;
+ char trash[1024];
+
+- FD_ZERO(&rfds);
++ pfd.fd = fd;
++ pfd.events = POLLIN;
+
+ do
+ {
+- FD_SET(fd, &rfds);
+- tv.tv_sec = 2;
+- tv.tv_usec = 0;
+- rv = select(fd + 1, &rfds, NULL, NULL, &tv);
++ rv = poll(&pfd, 1, libfcgiOsClosePollTimeout);
+ }
+ while (rv > 0 && read(fd, trash, sizeof(trash)) > 0);
+ }
+@@ -1116,13 +1127,11 @@ static int is_reasonable_accept_errno (const int error)
+ */
+ static int is_af_unix_keeper(const int fd)
+ {
+- struct timeval tval = { READABLE_UNIX_FD_DROP_DEAD_TIMEVAL };
+- fd_set read_fds;
+-
+- FD_ZERO(&read_fds);
+- FD_SET(fd, &read_fds);
++ struct pollfd pfd;
++ pfd.fd = fd;
++ pfd.events = POLLIN;
+
+- return select(fd + 1, &read_fds, NULL, NULL, &tval) >= 0 && FD_ISSET(fd, &read_fds);
++ return poll(&pfd, 1, libfcgiIsAfUnixKeeperPollTimeout) >= 0 && (pfd.revents & POLLIN);
+ }
+
+ /*
diff --git a/gnu/packages/patches/gst-plugins-good-fix-crashes.patch b/gnu/packages/patches/gst-plugins-good-fix-crashes.patch
deleted file mode 100644
index c36a595608..0000000000
--- a/gnu/packages/patches/gst-plugins-good-fix-crashes.patch
+++ /dev/null
@@ -1,1047 +0,0 @@
-Fixes upstream bug #774859 (flic decoder: Invalid memory read in
-flx_decode_chunks):
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774859
-
-Patch copied from upstream source repository:
-
-https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=be670f0daf67304fb92c76aa09c30cae0bfd1fe4
-
-From be670f0daf67304fb92c76aa09c30cae0bfd1fe4 Mon Sep 17 00:00:00 2001
-From: Matthew Waters <matthew@centricular.com>
-Date: Wed, 23 Nov 2016 07:09:06 +1100
-Subject: [PATCH] flxdec: rewrite logic based on GstByteReader/Writer
-
-Solves overreading/writing the given arrays and will error out if the
-streams asks to do that.
-
-Also does more error checking that the stream is valid and won't
-overrun any allocated arrays. Also mitigate integer overflow errors
-calculating allocation sizes.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774859
----
- gst/flx/flx_color.c | 1 -
- gst/flx/flx_fmt.h | 72 -------
- gst/flx/gstflxdec.c | 610 ++++++++++++++++++++++++++++++++++++----------------
- gst/flx/gstflxdec.h | 4 +-
- 4 files changed, 427 insertions(+), 260 deletions(-)
-
-diff --git a/gst/flx/flx_color.c b/gst/flx/flx_color.c
-index 047bfdf..3a58135 100644
---- a/gst/flx/flx_color.c
-+++ b/gst/flx/flx_color.c
-@@ -101,7 +101,6 @@ flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, guint num,
- } else {
- memcpy (&flxpal->palvec[start * 3], newpal, grab * 3);
- }
--
- }
-
- void
-diff --git a/gst/flx/flx_fmt.h b/gst/flx/flx_fmt.h
-index 9ab31ba..abff200 100644
---- a/gst/flx/flx_fmt.h
-+++ b/gst/flx/flx_fmt.h
-@@ -123,78 +123,6 @@ typedef struct _FlxFrameType
- } FlxFrameType;
- #define FlxFrameTypeSize 10
-
--#if G_BYTE_ORDER == G_BIG_ENDIAN
--#define LE_TO_BE_16(i16) ((guint16) (((i16) << 8) | ((i16) >> 8)))
--#define LE_TO_BE_32(i32) \
-- (((guint32) (LE_TO_BE_16((guint16) (i32))) << 16) | (LE_TO_BE_16((i32) >> 16)))
--
--#define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) \
-- do { \
-- (frm_type_p)->chunks = LE_TO_BE_16((frm_type_p)->chunks); \
-- (frm_type_p)->delay = LE_TO_BE_16((frm_type_p)->delay); \
-- } while(0)
--
--#define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) \
-- do { \
-- (hffmn_table_p)->codelength = \
-- LE_TO_BE_16((hffmn_table_p)->codelength); \
-- (hffmn_table_p)->numcodes = LE_TO_BE_16((hffmn_table_p)->numcodes); \
-- } while(0)
--
--#define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) \
-- ((sgmnt_table_p)->segments = LE_TO_BE_16((sgmnt_table_p)->segments))
--
--#define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) \
-- do { \
-- (prfx_chnk_p)->chunks = LE_TO_BE_16((prfx_chnk_p)->chunks); \
-- } while(0)
--
--#define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) \
-- do { \
-- (frm_chnk_p)->size = LE_TO_BE_32((frm_chnk_p)->size); \
-- (frm_chnk_p)->id = LE_TO_BE_16((frm_chnk_p)->id); \
-- } while(0)
--
--#define FLX_HDR_FIX_ENDIANNESS(hdr_p) \
-- do { \
-- (hdr_p)->size = LE_TO_BE_32((hdr_p)->size); \
-- (hdr_p)->type = LE_TO_BE_16((hdr_p)->type); \
-- (hdr_p)->frames = LE_TO_BE_16((hdr_p)->frames); \
-- (hdr_p)->width = LE_TO_BE_16((hdr_p)->width); \
-- (hdr_p)->height = LE_TO_BE_16((hdr_p)->height); \
-- (hdr_p)->depth = LE_TO_BE_16((hdr_p)->depth); \
-- (hdr_p)->flags = LE_TO_BE_16((hdr_p)->flags); \
-- (hdr_p)->speed = LE_TO_BE_32((hdr_p)->speed); \
-- (hdr_p)->reserved1 = LE_TO_BE_16((hdr_p)->reserved1); \
-- (hdr_p)->created = LE_TO_BE_32((hdr_p)->created); \
-- (hdr_p)->creator = LE_TO_BE_32((hdr_p)->creator); \
-- (hdr_p)->updated = LE_TO_BE_32((hdr_p)->updated); \
-- (hdr_p)->updater = LE_TO_BE_32((hdr_p)->updater); \
-- (hdr_p)->aspect_dx = LE_TO_BE_16((hdr_p)->aspect_dx); \
-- (hdr_p)->aspect_dy = LE_TO_BE_16((hdr_p)->aspect_dy); \
-- (hdr_p)->ext_flags = LE_TO_BE_16((hdr_p)->ext_flags); \
-- (hdr_p)->keyframes = LE_TO_BE_16((hdr_p)->keyframes); \
-- (hdr_p)->totalframes = LE_TO_BE_16((hdr_p)->totalframes); \
-- (hdr_p)->req_memory = LE_TO_BE_32((hdr_p)->req_memory); \
-- (hdr_p)->max_regions = LE_TO_BE_16((hdr_p)->max_regions); \
-- (hdr_p)->transp_num = LE_TO_BE_16((hdr_p)->transp_num); \
-- (hdr_p)->oframe1 = LE_TO_BE_32((hdr_p)->oframe1); \
-- (hdr_p)->oframe2 = LE_TO_BE_32((hdr_p)->oframe2); \
-- } while(0)
--#else
--
--#define LE_TO_BE_16(i16) ((i16))
--#define LE_TO_BE_32(i32) ((i32))
--
--#define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p)
--#define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p)
--#define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p)
--#define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p)
--#define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p)
--#define FLX_HDR_FIX_ENDIANNESS(hdr_p)
--
--#endif /* G_BYTE_ORDER == G_BIG_ENDIAN */
--
- G_END_DECLS
-
- #endif /* __GST_FLX_FMT_H__ */
-diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c
-index a237976..aa1bed5 100644
---- a/gst/flx/gstflxdec.c
-+++ b/gst/flx/gstflxdec.c
-@@ -1,5 +1,6 @@
- /* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@temple-baptist.com>
-+ * Copyright (C) <2016> Matthew Waters <matthew@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
-@@ -24,6 +25,7 @@
- /*
- * http://www.coolutils.com/Formats/FLI
- * http://woodshole.er.usgs.gov/operations/modeling/flc.html
-+ * http://www.compuphase.com/flic.htm
- */
-
- #ifdef HAVE_CONFIG_H
-@@ -73,10 +75,14 @@ static GstStateChangeReturn gst_flxdec_change_state (GstElement * element,
- static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstObject * parent,
- GstQuery * query);
-
--static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint);
--static gboolean flx_decode_brun (GstFlxDec *, guchar *, guchar *);
--static gboolean flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *);
--static gboolean flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *);
-+static gboolean flx_decode_color (GstFlxDec * flxdec, GstByteReader * reader,
-+ GstByteWriter * writer, gint scale);
-+static gboolean flx_decode_brun (GstFlxDec * flxdec,
-+ GstByteReader * reader, GstByteWriter * writer);
-+static gboolean flx_decode_delta_fli (GstFlxDec * flxdec,
-+ GstByteReader * reader, GstByteWriter * writer);
-+static gboolean flx_decode_delta_flc (GstFlxDec * flxdec,
-+ GstByteReader * reader, GstByteWriter * writer);
-
- #define rndalign(off) ((off) + ((off) & 1))
-
-@@ -204,57 +210,59 @@ gst_flxdec_sink_event_handler (GstPad * pad, GstObject * parent,
- }
-
- static gboolean
--flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data,
-- guchar * dest)
-+flx_decode_chunks (GstFlxDec * flxdec, gulong n_chunks, GstByteReader * reader,
-+ GstByteWriter * writer)
- {
-- FlxFrameChunk *hdr;
- gboolean ret = TRUE;
-
-- g_return_val_if_fail (data != NULL, FALSE);
--
-- while (count--) {
-- hdr = (FlxFrameChunk *) data;
-- FLX_FRAME_CHUNK_FIX_ENDIANNESS (hdr);
-- data += FlxFrameChunkSize;
-+ while (n_chunks--) {
-+ GstByteReader chunk;
-+ guint32 size;
-+ guint16 type;
-+
-+ if (!gst_byte_reader_get_uint32_le (reader, &size))
-+ goto parse_error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &type))
-+ goto parse_error;
-+ GST_LOG_OBJECT (flxdec, "chunk has type 0x%02x size %d", type, size);
-+
-+ if (!gst_byte_reader_get_sub_reader (reader, &chunk,
-+ size - FlxFrameChunkSize)) {
-+ GST_ERROR_OBJECT (flxdec, "Incorrect size in the chunk header");
-+ goto error;
-+ }
-
-- switch (hdr->id) {
-+ switch (type) {
- case FLX_COLOR64:
-- flx_decode_color (flxdec, data, dest, 2);
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
-+ ret = flx_decode_color (flxdec, &chunk, writer, 2);
- break;
-
- case FLX_COLOR256:
-- flx_decode_color (flxdec, data, dest, 0);
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
-+ ret = flx_decode_color (flxdec, &chunk, writer, 0);
- break;
-
- case FLX_BRUN:
-- ret = flx_decode_brun (flxdec, data, dest);
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
-+ ret = flx_decode_brun (flxdec, &chunk, writer);
- break;
-
- case FLX_LC:
-- ret = flx_decode_delta_fli (flxdec, data, dest);
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
-+ ret = flx_decode_delta_fli (flxdec, &chunk, writer);
- break;
-
- case FLX_SS2:
-- ret = flx_decode_delta_flc (flxdec, data, dest);
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
-+ ret = flx_decode_delta_flc (flxdec, &chunk, writer);
- break;
-
- case FLX_BLACK:
-- memset (dest, 0, flxdec->size);
-+ ret = gst_byte_writer_fill (writer, 0, flxdec->size);
- break;
-
- case FLX_MINI:
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
- break;
-
- default:
-- GST_WARNING ("Unimplented chunk type: 0x%02x size: %d - skipping",
-- hdr->id, hdr->size);
-- data += rndalign (hdr->size) - FlxFrameChunkSize;
-+ GST_WARNING ("Unimplemented chunk type: 0x%02x size: %d - skipping",
-+ type, size);
- break;
- }
-
-@@ -263,43 +271,60 @@ flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data,
- }
-
- return ret;
-+
-+parse_error:
-+ GST_ERROR_OBJECT (flxdec, "Failed to decode chunk");
-+error:
-+ return FALSE;
- }
-
-
--static void
--flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale)
-+static gboolean
-+flx_decode_color (GstFlxDec * flxdec, GstByteReader * reader,
-+ GstByteWriter * writer, gint scale)
- {
-- guint packs, count, indx;
-+ guint8 count, indx;
-+ guint16 packs;
-
-- g_return_if_fail (flxdec != NULL);
--
-- packs = (data[0] + (data[1] << 8));
--
-- data += 2;
-+ if (!gst_byte_reader_get_uint16_le (reader, &packs))
-+ goto error;
- indx = 0;
-
-- GST_LOG ("GstFlxDec: cmap packs: %d", packs);
-+ GST_LOG ("GstFlxDec: cmap packs: %d", (guint) packs);
- while (packs--) {
-+ const guint8 *data;
-+ guint16 actual_count;
-+
- /* color map index + skip count */
-- indx += *data++;
-+ if (!gst_byte_reader_get_uint8 (reader, &indx))
-+ goto error;
-
- /* number of rgb triplets */
-- count = *data++ & 0xff;
-- if (count == 0)
-- count = 256;
-+ if (!gst_byte_reader_get_uint8 (reader, &count))
-+ goto error;
-
-- GST_LOG ("GstFlxDec: cmap count: %d (indx: %d)", count, indx);
-- flx_set_palette_vector (flxdec->converter, indx, count, data, scale);
-+ actual_count = count == 0 ? 256 : count;
-
-- data += (count * 3);
-+ if (!gst_byte_reader_get_data (reader, count * 3, &data))
-+ goto error;
-+
-+ GST_LOG_OBJECT (flxdec, "cmap count: %d (indx: %d)", actual_count, indx);
-+ flx_set_palette_vector (flxdec->converter, indx, actual_count,
-+ (guchar *) data, scale);
- }
-+
-+ return TRUE;
-+
-+error:
-+ GST_ERROR_OBJECT (flxdec, "Error decoding color palette");
-+ return FALSE;
- }
-
- static gboolean
--flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
-+flx_decode_brun (GstFlxDec * flxdec, GstByteReader * reader,
-+ GstByteWriter * writer)
- {
-- gulong count, lines, row;
-- guchar x;
-+ gulong lines, row;
-
- g_return_val_if_fail (flxdec != NULL, FALSE);
-
-@@ -310,82 +335,125 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
- * contain more then 255 RLE packets. we use the frame
- * width instead.
- */
-- data++;
-+ if (!gst_byte_reader_skip (reader, 1))
-+ goto error;
-
- row = flxdec->hdr.width;
- while (row) {
-- count = *data++;
-+ gint8 count;
-+
-+ if (!gst_byte_reader_get_int8 (reader, &count))
-+ goto error;
-+
-+ if (count <= 0) {
-+ const guint8 *data;
-
-- if (count > 0x7f) {
- /* literal run */
-- count = 0x100 - count;
-- if ((glong) row - (glong) count < 0) {
-- GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected.");
-+ count = ABS (count);
-+
-+ GST_LOG_OBJECT (flxdec, "have literal run of size %d", count);
-+
-+ if (count > row) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN line detected. "
-+ "bytes to write exceeds the end of the row");
- return FALSE;
- }
- row -= count;
-
-- while (count--)
-- *dest++ = *data++;
--
-+ if (!gst_byte_reader_get_data (reader, count, &data))
-+ goto error;
-+ if (!gst_byte_writer_put_data (writer, data, count))
-+ goto error;
- } else {
-- if ((glong) row - (glong) count < 0) {
-- GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected.");
-+ guint8 x;
-+
-+ GST_LOG_OBJECT (flxdec, "have replicate run of size %d", count);
-+
-+ if (count > row) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."
-+ "bytes to write exceeds the end of the row");
- return FALSE;
- }
-
- /* replicate run */
- row -= count;
-- x = *data++;
-
-- while (count--)
-- *dest++ = x;
-+ if (!gst_byte_reader_get_uint8 (reader, &x))
-+ goto error;
-+ if (!gst_byte_writer_fill (writer, x, count))
-+ goto error;
- }
- }
- }
-
- return TRUE;
-+
-+error:
-+ GST_ERROR_OBJECT (flxdec, "Failed to decode BRUN packet");
-+ return FALSE;
- }
-
- static gboolean
--flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
-+flx_decode_delta_fli (GstFlxDec * flxdec, GstByteReader * reader,
-+ GstByteWriter * writer)
- {
-- gulong count, packets, lines, start_line;
-- guchar *start_p, x;
-+ guint16 start_line, lines;
-+ guint line_start_i;
-
- g_return_val_if_fail (flxdec != NULL, FALSE);
- g_return_val_if_fail (flxdec->delta_data != NULL, FALSE);
-
- /* use last frame for delta */
-- memcpy (dest, flxdec->delta_data, flxdec->size);
-+ if (!gst_byte_writer_put_data (writer, flxdec->delta_data, flxdec->size))
-+ goto error;
-+
-+ if (!gst_byte_reader_get_uint16_le (reader, &start_line))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &lines))
-+ goto error;
-+ GST_LOG_OBJECT (flxdec, "height %d start line %d line count %d",
-+ flxdec->hdr.height, start_line, lines);
-
-- start_line = (data[0] + (data[1] << 8));
-- lines = (data[2] + (data[3] << 8));
- if (start_line + lines > flxdec->hdr.height) {
- GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. too many lines.");
- return FALSE;
- }
-- data += 4;
-
-- /* start position of delta */
-- dest += (flxdec->hdr.width * start_line);
-- start_p = dest;
-+ line_start_i = flxdec->hdr.width * start_line;
-+ if (!gst_byte_writer_set_pos (writer, line_start_i))
-+ goto error;
-
- while (lines--) {
-+ guint8 packets;
-+
- /* packet count */
-- packets = *data++;
-+ if (!gst_byte_reader_get_uint8 (reader, &packets))
-+ goto error;
-+ GST_LOG_OBJECT (flxdec, "have %d packets", packets);
-
- while (packets--) {
- /* skip count */
-- guchar skip = *data++;
-- dest += skip;
-+ guint8 skip;
-+ gint8 count;
-+ if (!gst_byte_reader_get_uint8 (reader, &skip))
-+ goto error;
-+
-+ /* skip bytes */
-+ if (!gst_byte_writer_set_pos (writer,
-+ gst_byte_writer_get_pos (writer) + skip))
-+ goto error;
-
- /* RLE count */
-- count = *data++;
-+ if (!gst_byte_reader_get_int8 (reader, &count))
-+ goto error;
-+
-+ if (count < 0) {
-+ guint8 x;
-
-- if (count > 0x7f) {
- /* literal run */
-- count = 0x100 - count;
-+ count = ABS (count);
-+ GST_LOG_OBJECT (flxdec, "have literal run of size %d at offset %d",
-+ count, skip);
-
- if (skip + count > flxdec->hdr.width) {
- GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. "
-@@ -393,11 +461,16 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
- return FALSE;
- }
-
-- x = *data++;
-- while (count--)
-- *dest++ = x;
--
-+ if (!gst_byte_reader_get_uint8 (reader, &x))
-+ goto error;
-+ if (!gst_byte_writer_fill (writer, x, count))
-+ goto error;
- } else {
-+ const guint8 *data;
-+
-+ GST_LOG_OBJECT (flxdec, "have replicate run of size %d at offset %d",
-+ count, skip);
-+
- if (skip + count > flxdec->hdr.width) {
- GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. "
- "line too long.");
-@@ -405,45 +478,60 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
- }
-
- /* replicate run */
-- while (count--)
-- *dest++ = *data++;
-+ if (!gst_byte_reader_get_data (reader, count, &data))
-+ goto error;
-+ if (!gst_byte_writer_put_data (writer, data, count))
-+ goto error;
- }
- }
-- start_p += flxdec->hdr.width;
-- dest = start_p;
-+ line_start_i += flxdec->hdr.width;
-+ if (!gst_byte_writer_set_pos (writer, line_start_i))
-+ goto error;
- }
-
- return TRUE;
-+
-+error:
-+ GST_ERROR_OBJECT (flxdec, "Failed to decode FLI packet");
-+ return FALSE;
- }
-
- static gboolean
--flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
-+flx_decode_delta_flc (GstFlxDec * flxdec, GstByteReader * reader,
-+ GstByteWriter * writer)
- {
-- gulong count, lines, start_l, opcode;
-- guchar *start_p;
-+ guint16 lines, start_l;
-
- g_return_val_if_fail (flxdec != NULL, FALSE);
- g_return_val_if_fail (flxdec->delta_data != NULL, FALSE);
-
- /* use last frame for delta */
-- memcpy (dest, flxdec->delta_data, flxdec->size);
-+ if (!gst_byte_writer_put_data (writer, flxdec->delta_data, flxdec->size))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &lines))
-+ goto error;
-
-- lines = (data[0] + (data[1] << 8));
- if (lines > flxdec->hdr.height) {
- GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. too many lines.");
- return FALSE;
- }
-- data += 2;
-
-- start_p = dest;
- start_l = lines;
-
- while (lines) {
-- dest = start_p + (flxdec->hdr.width * (start_l - lines));
-+ guint16 opcode;
-+
-+ if (!gst_byte_writer_set_pos (writer,
-+ flxdec->hdr.width * (start_l - lines)))
-+ goto error;
-
- /* process opcode(s) */
-- while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) {
-- data += 2;
-+ while (TRUE) {
-+ if (!gst_byte_reader_get_uint16_le (reader, &opcode))
-+ goto error;
-+ if ((opcode & 0xc000) == 0)
-+ break;
-+
- if ((opcode & 0xc000) == 0xc000) {
- /* line skip count */
- gulong skip = (0x10000 - opcode);
-@@ -453,27 +541,44 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- return FALSE;
- }
- start_l += skip;
-- dest += flxdec->hdr.width * skip;
-+ if (!gst_byte_writer_set_pos (writer,
-+ gst_byte_writer_get_pos (writer) + flxdec->hdr.width * skip))
-+ goto error;
- } else {
- /* last pixel */
-- dest += flxdec->hdr.width;
-- *dest++ = (opcode & 0xff);
-+ if (!gst_byte_writer_set_pos (writer,
-+ gst_byte_writer_get_pos (writer) + flxdec->hdr.width))
-+ goto error;
-+ if (!gst_byte_writer_put_uint8 (writer, opcode & 0xff))
-+ goto error;
- }
- }
-- data += 2;
-
- /* last opcode is the packet count */
-+ GST_LOG_OBJECT (flxdec, "have %d packets", opcode);
- while (opcode--) {
- /* skip count */
-- guchar skip = *data++;
-- dest += skip;
-+ guint8 skip;
-+ gint8 count;
-+
-+ if (!gst_byte_reader_get_uint8 (reader, &skip))
-+ goto error;
-+ if (!gst_byte_writer_set_pos (writer,
-+ gst_byte_writer_get_pos (writer) + skip))
-+ goto error;
-
- /* RLE count */
-- count = *data++;
-+ if (!gst_byte_reader_get_int8 (reader, &count))
-+ goto error;
-+
-+ if (count < 0) {
-+ guint16 x;
-
-- if (count > 0x7f) {
- /* replicate word run */
-- count = 0x100 - count;
-+ count = ABS (count);
-+
-+ GST_LOG_OBJECT (flxdec, "have replicate run of size %d at offset %d",
-+ count, skip);
-
- if (skip + count > flxdec->hdr.width) {
- GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. "
-@@ -481,22 +586,31 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- return FALSE;
- }
-
-+ if (!gst_byte_reader_get_uint16_le (reader, &x))
-+ goto error;
-+
- while (count--) {
-- *dest++ = data[0];
-- *dest++ = data[1];
-+ if (!gst_byte_writer_put_uint16_le (writer, x)) {
-+ goto error;
-+ }
- }
-- data += 2;
- } else {
-+ GST_LOG_OBJECT (flxdec, "have literal run of size %d at offset %d",
-+ count, skip);
-+
- if (skip + count > flxdec->hdr.width) {
- GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. "
- "line too long.");
- return FALSE;
- }
-
-- /* literal word run */
- while (count--) {
-- *dest++ = *data++;
-- *dest++ = *data++;
-+ guint16 x;
-+
-+ if (!gst_byte_reader_get_uint16_le (reader, &x))
-+ goto error;
-+ if (!gst_byte_writer_put_uint16_le (writer, x))
-+ goto error;
- }
- }
- }
-@@ -504,13 +618,91 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- }
-
- return TRUE;
-+
-+error:
-+ GST_ERROR_OBJECT (flxdec, "Failed to decode FLI packet");
-+ return FALSE;
-+}
-+
-+static gboolean
-+_read_flx_header (GstFlxDec * flxdec, GstByteReader * reader, FlxHeader * flxh)
-+{
-+ memset (flxh, 0, sizeof (*flxh));
-+
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->size))
-+ goto error;
-+ if (flxh->size < FlxHeaderSize) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid file size in the header");
-+ return FALSE;
-+ }
-+
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->type))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->frames))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->width))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->height))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->depth))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->flags))
-+ goto error;
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->speed))
-+ goto error;
-+ if (!gst_byte_reader_skip (reader, 2)) /* reserved */
-+ goto error;
-+ /* FLC */
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->created))
-+ goto error;
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->creator))
-+ goto error;
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->updated))
-+ goto error;
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->updater))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->aspect_dx))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->aspect_dy))
-+ goto error;
-+ /* EGI */
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->ext_flags))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->keyframes))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->totalframes))
-+ goto error;
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->req_memory))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->max_regions))
-+ goto error;
-+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->transp_num))
-+ goto error;
-+ if (!gst_byte_reader_skip (reader, 24)) /* reserved */
-+ goto error;
-+ /* FLC */
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->oframe1))
-+ goto error;
-+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->oframe2))
-+ goto error;
-+ if (!gst_byte_reader_skip (reader, 40)) /* reserved */
-+ goto error;
-+
-+ return TRUE;
-+
-+error:
-+ GST_ERROR_OBJECT (flxdec, "Error reading file header");
-+ return FALSE;
- }
-
- static GstFlowReturn
- gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
- {
-+ GstByteReader reader;
-+ GstBuffer *input;
-+ GstMapInfo map_info;
- GstCaps *caps;
-- guint avail;
-+ guint available;
- GstFlowReturn res = GST_FLOW_OK;
-
- GstFlxDec *flxdec;
-@@ -521,31 +713,50 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
- g_return_val_if_fail (flxdec != NULL, GST_FLOW_ERROR);
-
- gst_adapter_push (flxdec->adapter, buf);
-- avail = gst_adapter_available (flxdec->adapter);
-+ available = gst_adapter_available (flxdec->adapter);
-+ input = gst_adapter_get_buffer (flxdec->adapter, available);
-+ if (!gst_buffer_map (input, &map_info, GST_MAP_READ)) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Failed to map buffer"), (NULL));
-+ goto error;
-+ }
-+ gst_byte_reader_init (&reader, map_info.data, map_info.size);
-
- if (flxdec->state == GST_FLXDEC_READ_HEADER) {
-- if (avail >= FlxHeaderSize) {
-- const guint8 *data = gst_adapter_map (flxdec->adapter, FlxHeaderSize);
-+ if (available >= FlxHeaderSize) {
-+ GstByteReader header;
- GstCaps *templ;
-
-- memcpy ((gchar *) & flxdec->hdr, data, FlxHeaderSize);
-- FLX_HDR_FIX_ENDIANNESS (&(flxdec->hdr));
-- gst_adapter_unmap (flxdec->adapter);
-+ if (!gst_byte_reader_get_sub_reader (&reader, &header, FlxHeaderSize)) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Could not read header"), (NULL));
-+ goto unmap_input_error;
-+ }
- gst_adapter_flush (flxdec->adapter, FlxHeaderSize);
-+ available -= FlxHeaderSize;
-+
-+ if (!_read_flx_header (flxdec, &header, &flxdec->hdr)) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Failed to parse header"), (NULL));
-+ goto unmap_input_error;
-+ }
-
- flxh = &flxdec->hdr;
-
- /* check header */
- if (flxh->type != FLX_MAGICHDR_FLI &&
-- flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX)
-- goto wrong_type;
-+ flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL),
-+ ("not a flx file (type %x)", flxh->type));
-+ goto unmap_input_error;
-+ }
-
-- GST_LOG ("size : %d", flxh->size);
-- GST_LOG ("frames : %d", flxh->frames);
-- GST_LOG ("width : %d", flxh->width);
-- GST_LOG ("height : %d", flxh->height);
-- GST_LOG ("depth : %d", flxh->depth);
-- GST_LOG ("speed : %d", flxh->speed);
-+ GST_INFO_OBJECT (flxdec, "size : %d", flxh->size);
-+ GST_INFO_OBJECT (flxdec, "frames : %d", flxh->frames);
-+ GST_INFO_OBJECT (flxdec, "width : %d", flxh->width);
-+ GST_INFO_OBJECT (flxdec, "height : %d", flxh->height);
-+ GST_INFO_OBJECT (flxdec, "depth : %d", flxh->depth);
-+ GST_INFO_OBJECT (flxdec, "speed : %d", flxh->speed);
-
- flxdec->next_time = 0;
-
-@@ -573,18 +784,32 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
- gst_pad_set_caps (flxdec->srcpad, caps);
- gst_caps_unref (caps);
-
-- if (flxh->depth <= 8)
-- flxdec->converter =
-- flx_colorspace_converter_new (flxh->width, flxh->height);
-+ /* zero means 8 */
-+ if (flxh->depth == 0)
-+ flxh->depth = 8;
-+
-+ if (flxh->depth != 8) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE,
-+ ("%s", "Don't know how to decode non 8 bit depth streams"), (NULL));
-+ goto unmap_input_error;
-+ }
-+
-+ flxdec->converter =
-+ flx_colorspace_converter_new (flxh->width, flxh->height);
-
- if (flxh->type == FLX_MAGICHDR_FLC || flxh->type == FLX_MAGICHDR_FLX) {
-- GST_LOG ("(FLC) aspect_dx : %d", flxh->aspect_dx);
-- GST_LOG ("(FLC) aspect_dy : %d", flxh->aspect_dy);
-- GST_LOG ("(FLC) oframe1 : 0x%08x", flxh->oframe1);
-- GST_LOG ("(FLC) oframe2 : 0x%08x", flxh->oframe2);
-+ GST_INFO_OBJECT (flxdec, "(FLC) aspect_dx : %d", flxh->aspect_dx);
-+ GST_INFO_OBJECT (flxdec, "(FLC) aspect_dy : %d", flxh->aspect_dy);
-+ GST_INFO_OBJECT (flxdec, "(FLC) oframe1 : 0x%08x", flxh->oframe1);
-+ GST_INFO_OBJECT (flxdec, "(FLC) oframe2 : 0x%08x", flxh->oframe2);
- }
-
- flxdec->size = ((guint) flxh->width * (guint) flxh->height);
-+ if (flxdec->size >= G_MAXSIZE / 4) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Cannot allocate required memory"), (NULL));
-+ goto unmap_input_error;
-+ }
-
- /* create delta and output frame */
- flxdec->frame_data = g_malloc (flxdec->size);
-@@ -596,55 +821,66 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
- GstBuffer *out;
-
- /* while we have enough data in the adapter */
-- while (avail >= FlxFrameChunkSize && res == GST_FLOW_OK) {
-- FlxFrameChunk flxfh;
-- guchar *chunk;
-- const guint8 *data;
-- GstMapInfo map;
--
-- chunk = NULL;
-- data = gst_adapter_map (flxdec->adapter, FlxFrameChunkSize);
-- memcpy (&flxfh, data, FlxFrameChunkSize);
-- FLX_FRAME_CHUNK_FIX_ENDIANNESS (&flxfh);
-- gst_adapter_unmap (flxdec->adapter);
--
-- switch (flxfh.id) {
-- case FLX_FRAME_TYPE:
-- /* check if we have the complete frame */
-- if (avail < flxfh.size)
-- goto need_more_data;
--
-- /* flush header */
-- gst_adapter_flush (flxdec->adapter, FlxFrameChunkSize);
--
-- chunk = gst_adapter_take (flxdec->adapter,
-- flxfh.size - FlxFrameChunkSize);
-- FLX_FRAME_TYPE_FIX_ENDIANNESS ((FlxFrameType *) chunk);
-- if (((FlxFrameType *) chunk)->chunks == 0)
-- break;
-+ while (available >= FlxFrameChunkSize && res == GST_FLOW_OK) {
-+ guint32 size;
-+ guint16 type;
-
-- /* create 32 bits output frame */
--// res = gst_pad_alloc_buffer_and_set_caps (flxdec->srcpad,
--// GST_BUFFER_OFFSET_NONE,
--// flxdec->size * 4, GST_PAD_CAPS (flxdec->srcpad), &out);
--// if (res != GST_FLOW_OK)
--// break;
-+ if (!gst_byte_reader_get_uint32_le (&reader, &size))
-+ goto parse_error;
-+ if (available < size)
-+ goto need_more_data;
-
-- out = gst_buffer_new_and_alloc (flxdec->size * 4);
-+ available -= size;
-+ gst_adapter_flush (flxdec->adapter, size);
-+
-+ if (!gst_byte_reader_get_uint16_le (&reader, &type))
-+ goto parse_error;
-+
-+ switch (type) {
-+ case FLX_FRAME_TYPE:{
-+ GstByteReader chunks;
-+ GstByteWriter writer;
-+ guint16 n_chunks;
-+ GstMapInfo map;
-+
-+ GST_LOG_OBJECT (flxdec, "Have frame type 0x%02x of size %d", type,
-+ size);
-+
-+ if (!gst_byte_reader_get_sub_reader (&reader, &chunks,
-+ size - FlxFrameChunkSize))
-+ goto parse_error;
-+
-+ if (!gst_byte_reader_get_uint16_le (&chunks, &n_chunks))
-+ goto parse_error;
-+ GST_LOG_OBJECT (flxdec, "Have %d chunks", n_chunks);
-+
-+ if (n_chunks == 0)
-+ break;
-+ if (!gst_byte_reader_skip (&chunks, 8)) /* reserved */
-+ goto parse_error;
-+
-+ gst_byte_writer_init_with_data (&writer, flxdec->frame_data,
-+ flxdec->size, TRUE);
-
- /* decode chunks */
-- if (!flx_decode_chunks (flxdec,
-- ((FlxFrameType *) chunk)->chunks,
-- chunk + FlxFrameTypeSize, flxdec->frame_data)) {
-+ if (!flx_decode_chunks (flxdec, n_chunks, &chunks, &writer)) {
- GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
- ("%s", "Could not decode chunk"), NULL);
-- return GST_FLOW_ERROR;
-+ goto unmap_input_error;
- }
-+ gst_byte_writer_reset (&writer);
-
- /* save copy of the current frame for possible delta. */
- memcpy (flxdec->delta_data, flxdec->frame_data, flxdec->size);
-
-- gst_buffer_map (out, &map, GST_MAP_WRITE);
-+ out = gst_buffer_new_and_alloc (flxdec->size * 4);
-+ if (!gst_buffer_map (out, &map, GST_MAP_WRITE)) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Could not map output buffer"), NULL);
-+ gst_buffer_unref (out);
-+ goto unmap_input_error;
-+ }
-+
- /* convert current frame. */
- flx_colorspace_convert (flxdec->converter, flxdec->frame_data,
- map.data);
-@@ -655,30 +891,32 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
-
- res = gst_pad_push (flxdec->srcpad, out);
- break;
-+ }
- default:
-- /* check if we have the complete frame */
-- if (avail < flxfh.size)
-- goto need_more_data;
--
-- gst_adapter_flush (flxdec->adapter, flxfh.size);
-+ GST_DEBUG_OBJECT (flxdec, "Unknown frame type 0x%02x, skipping %d",
-+ type, size);
-+ if (!gst_byte_reader_skip (&reader, size - FlxFrameChunkSize))
-+ goto parse_error;
- break;
- }
--
-- g_free (chunk);
--
-- avail = gst_adapter_available (flxdec->adapter);
- }
- }
-+
-+ gst_buffer_unmap (input, &map_info);
-+ gst_buffer_unref (input);
-+
- need_more_data:
- return res;
-
- /* ERRORS */
--wrong_type:
-- {
-- GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL),
-- ("not a flx file (type %x)", flxh->type));
-- return GST_FLOW_ERROR;
-- }
-+parse_error:
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Failed to parse stream"), (NULL));
-+unmap_input_error:
-+ gst_buffer_unmap (input, &map_info);
-+ gst_buffer_unref (input);
-+error:
-+ return GST_FLOW_ERROR;
- }
-
- static GstStateChangeReturn
-diff --git a/gst/flx/gstflxdec.h b/gst/flx/gstflxdec.h
-index 3f9a0aa..4fd8dfd 100644
---- a/gst/flx/gstflxdec.h
-+++ b/gst/flx/gstflxdec.h
-@@ -23,6 +23,8 @@
- #include <gst/gst.h>
-
- #include <gst/base/gstadapter.h>
-+#include <gst/base/gstbytereader.h>
-+#include <gst/base/gstbytewriter.h>
- #include "flx_color.h"
-
- G_BEGIN_DECLS
-@@ -45,7 +47,7 @@ struct _GstFlxDec {
-
- guint8 *delta_data, *frame_data;
- GstAdapter *adapter;
-- gulong size;
-+ gsize size;
- GstFlxDecState state;
- gint64 frame_time;
- gint64 next_time;
---
-2.10.2
-
diff --git a/gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch b/gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch
deleted file mode 100644
index 1daaa2ae15..0000000000
--- a/gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-Fixes upstream bug #774897 (flxdec: Unreferences itself one time too many on
-invalid files):
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774897
-
-Patch copied from upstream source repository:
-
-https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=b31c504645a814c59d91d49e4fe218acaf93f4ca
-
-From b31c504645a814c59d91d49e4fe218acaf93f4ca Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
-Date: Wed, 23 Nov 2016 11:20:49 +0200
-Subject: [PATCH] flxdec: Don't unref() parent in the chain function
-
-We don't own the reference here, it is owned by the caller and given to
-us for the scope of this function. Leftover mistake from 0.10 porting.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774897
----
- gst/flx/gstflxdec.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c
-index e675c99..a237976 100644
---- a/gst/flx/gstflxdec.c
-+++ b/gst/flx/gstflxdec.c
-@@ -677,7 +677,6 @@ wrong_type:
- {
- GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL),
- ("not a flx file (type %x)", flxh->type));
-- gst_object_unref (flxdec);
- return GST_FLOW_ERROR;
- }
- }
---
-2.10.2
-
diff --git a/gnu/packages/patches/gst-plugins-good-fix-signedness.patch b/gnu/packages/patches/gst-plugins-good-fix-signedness.patch
deleted file mode 100644
index a3e20e19dd..0000000000
--- a/gnu/packages/patches/gst-plugins-good-fix-signedness.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-This is a followup fix for upstream bug #774834 (flic decoder: Buffer overflow
-in flx_decode_delta_fli):
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774834#c2
-
-Patch copied from upstream source repository:
-
-https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=1ab2b26193861b124426e2f8eb62b75b59ec5488
-
-From 1ab2b26193861b124426e2f8eb62b75b59ec5488 Mon Sep 17 00:00:00 2001
-From: Matthew Waters <matthew@centricular.com>
-Date: Tue, 22 Nov 2016 23:46:00 +1100
-Subject: [PATCH] flxdec: fix some warnings comparing unsigned < 0
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-bf43f44fcfada5ec4a3ce60cb374340486fe9fac was comparing an unsigned
-expression to be < 0 which was always false.
-
-gstflxdec.c: In function ‘flx_decode_brun’:
-gstflxdec.c:322:33: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
- if ((glong) row - count < 0) {
- ^
-gstflxdec.c:332:33: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
- if ((glong) row - count < 0) {
- ^
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774834
----
- gst/flx/gstflxdec.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c
-index d51a8e6..e675c99 100644
---- a/gst/flx/gstflxdec.c
-+++ b/gst/flx/gstflxdec.c
-@@ -319,7 +319,7 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
- if (count > 0x7f) {
- /* literal run */
- count = 0x100 - count;
-- if ((glong) row - count < 0) {
-+ if ((glong) row - (glong) count < 0) {
- GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected.");
- return FALSE;
- }
-@@ -329,7 +329,7 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
- *dest++ = *data++;
-
- } else {
-- if ((glong) row - count < 0) {
-+ if ((glong) row - (glong) count < 0) {
- GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected.");
- return FALSE;
- }
---
-2.10.2
-
diff --git a/gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch b/gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch
deleted file mode 100644
index f77dca2cd6..0000000000
--- a/gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch
+++ /dev/null
@@ -1,319 +0,0 @@
-Fix CVE-2016-{9634,9635,9636}.
-
-https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9634
-https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9635
-https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9636
-
-This fixes upstream bug #774834 (flic decoder: Buffer overflow in
-flx_decode_delta_fli):
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774834
-
-Patch copied from upstream source repository:
-
-https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=2e203a79b7d9af4029307c1a845b3c148d5f5e62
-
-From 2e203a79b7d9af4029307c1a845b3c148d5f5e62 Mon Sep 17 00:00:00 2001
-From: Matthew Waters <matthew@centricular.com>
-Date: Tue, 22 Nov 2016 19:05:00 +1100
-Subject: [PATCH] flxdec: add some write bounds checking
-
-Without checking the bounds of the frame we are writing into, we can
-write off the end of the destination buffer.
-
-https://scarybeastsecurity.blogspot.dk/2016/11/0day-exploit-advancing-exploitation.html
-
-https://bugzilla.gnome.org/show_bug.cgi?id=774834
----
- gst/flx/gstflxdec.c | 116 +++++++++++++++++++++++++++++++++++++++++-----------
- 1 file changed, 91 insertions(+), 25 deletions(-)
-
-diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c
-index 604be2f..d51a8e6 100644
---- a/gst/flx/gstflxdec.c
-+++ b/gst/flx/gstflxdec.c
-@@ -74,9 +74,9 @@ static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstObject * parent,
- GstQuery * query);
-
- static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint);
--static void flx_decode_brun (GstFlxDec *, guchar *, guchar *);
--static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *);
--static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *);
-+static gboolean flx_decode_brun (GstFlxDec *, guchar *, guchar *);
-+static gboolean flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *);
-+static gboolean flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *);
-
- #define rndalign(off) ((off) + ((off) & 1))
-
-@@ -203,13 +203,14 @@ gst_flxdec_sink_event_handler (GstPad * pad, GstObject * parent,
- return ret;
- }
-
--static void
-+static gboolean
- flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data,
- guchar * dest)
- {
- FlxFrameChunk *hdr;
-+ gboolean ret = TRUE;
-
-- g_return_if_fail (data != NULL);
-+ g_return_val_if_fail (data != NULL, FALSE);
-
- while (count--) {
- hdr = (FlxFrameChunk *) data;
-@@ -228,17 +229,17 @@ flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data,
- break;
-
- case FLX_BRUN:
-- flx_decode_brun (flxdec, data, dest);
-+ ret = flx_decode_brun (flxdec, data, dest);
- data += rndalign (hdr->size) - FlxFrameChunkSize;
- break;
-
- case FLX_LC:
-- flx_decode_delta_fli (flxdec, data, dest);
-+ ret = flx_decode_delta_fli (flxdec, data, dest);
- data += rndalign (hdr->size) - FlxFrameChunkSize;
- break;
-
- case FLX_SS2:
-- flx_decode_delta_flc (flxdec, data, dest);
-+ ret = flx_decode_delta_flc (flxdec, data, dest);
- data += rndalign (hdr->size) - FlxFrameChunkSize;
- break;
-
-@@ -256,7 +257,12 @@ flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data,
- data += rndalign (hdr->size) - FlxFrameChunkSize;
- break;
- }
-+
-+ if (!ret)
-+ break;
- }
-+
-+ return ret;
- }
-
-
-@@ -289,13 +295,13 @@ flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale)
- }
- }
-
--static void
-+static gboolean
- flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
- {
- gulong count, lines, row;
- guchar x;
-
-- g_return_if_fail (flxdec != NULL);
-+ g_return_val_if_fail (flxdec != NULL, FALSE);
-
- lines = flxdec->hdr.height;
- while (lines--) {
-@@ -313,12 +319,21 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
- if (count > 0x7f) {
- /* literal run */
- count = 0x100 - count;
-+ if ((glong) row - count < 0) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected.");
-+ return FALSE;
-+ }
- row -= count;
-
- while (count--)
- *dest++ = *data++;
-
- } else {
-+ if ((glong) row - count < 0) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected.");
-+ return FALSE;
-+ }
-+
- /* replicate run */
- row -= count;
- x = *data++;
-@@ -328,22 +343,28 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest)
- }
- }
- }
-+
-+ return TRUE;
- }
-
--static void
-+static gboolean
- flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
- {
- gulong count, packets, lines, start_line;
- guchar *start_p, x;
-
-- g_return_if_fail (flxdec != NULL);
-- g_return_if_fail (flxdec->delta_data != NULL);
-+ g_return_val_if_fail (flxdec != NULL, FALSE);
-+ g_return_val_if_fail (flxdec->delta_data != NULL, FALSE);
-
- /* use last frame for delta */
- memcpy (dest, flxdec->delta_data, flxdec->size);
-
- start_line = (data[0] + (data[1] << 8));
- lines = (data[2] + (data[3] << 8));
-+ if (start_line + lines > flxdec->hdr.height) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. too many lines.");
-+ return FALSE;
-+ }
- data += 4;
-
- /* start position of delta */
-@@ -356,7 +377,8 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
-
- while (packets--) {
- /* skip count */
-- dest += *data++;
-+ guchar skip = *data++;
-+ dest += skip;
-
- /* RLE count */
- count = *data++;
-@@ -364,12 +386,24 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
- if (count > 0x7f) {
- /* literal run */
- count = 0x100 - count;
-- x = *data++;
-
-+ if (skip + count > flxdec->hdr.width) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. "
-+ "line too long.");
-+ return FALSE;
-+ }
-+
-+ x = *data++;
- while (count--)
- *dest++ = x;
-
- } else {
-+ if (skip + count > flxdec->hdr.width) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. "
-+ "line too long.");
-+ return FALSE;
-+ }
-+
- /* replicate run */
- while (count--)
- *dest++ = *data++;
-@@ -378,21 +412,27 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest)
- start_p += flxdec->hdr.width;
- dest = start_p;
- }
-+
-+ return TRUE;
- }
-
--static void
-+static gboolean
- flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- {
- gulong count, lines, start_l, opcode;
- guchar *start_p;
-
-- g_return_if_fail (flxdec != NULL);
-- g_return_if_fail (flxdec->delta_data != NULL);
-+ g_return_val_if_fail (flxdec != NULL, FALSE);
-+ g_return_val_if_fail (flxdec->delta_data != NULL, FALSE);
-
- /* use last frame for delta */
- memcpy (dest, flxdec->delta_data, flxdec->size);
-
- lines = (data[0] + (data[1] << 8));
-+ if (lines > flxdec->hdr.height) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. too many lines.");
-+ return FALSE;
-+ }
- data += 2;
-
- start_p = dest;
-@@ -405,9 +445,15 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) {
- data += 2;
- if ((opcode & 0xc000) == 0xc000) {
-- /* skip count */
-- start_l += (0x10000 - opcode);
-- dest += flxdec->hdr.width * (0x10000 - opcode);
-+ /* line skip count */
-+ gulong skip = (0x10000 - opcode);
-+ if (skip > flxdec->hdr.height) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. "
-+ "skip line count too big.");
-+ return FALSE;
-+ }
-+ start_l += skip;
-+ dest += flxdec->hdr.width * skip;
- } else {
- /* last pixel */
- dest += flxdec->hdr.width;
-@@ -419,7 +465,8 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- /* last opcode is the packet count */
- while (opcode--) {
- /* skip count */
-- dest += *data++;
-+ guchar skip = *data++;
-+ dest += skip;
-
- /* RLE count */
- count = *data++;
-@@ -427,12 +474,25 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- if (count > 0x7f) {
- /* replicate word run */
- count = 0x100 - count;
-+
-+ if (skip + count > flxdec->hdr.width) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. "
-+ "line too long.");
-+ return FALSE;
-+ }
-+
- while (count--) {
- *dest++ = data[0];
- *dest++ = data[1];
- }
- data += 2;
- } else {
-+ if (skip + count > flxdec->hdr.width) {
-+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. "
-+ "line too long.");
-+ return FALSE;
-+ }
-+
- /* literal word run */
- while (count--) {
- *dest++ = *data++;
-@@ -442,6 +502,8 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest)
- }
- lines--;
- }
-+
-+ return TRUE;
- }
-
- static GstFlowReturn
-@@ -571,9 +633,13 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
- out = gst_buffer_new_and_alloc (flxdec->size * 4);
-
- /* decode chunks */
-- flx_decode_chunks (flxdec,
-- ((FlxFrameType *) chunk)->chunks,
-- chunk + FlxFrameTypeSize, flxdec->frame_data);
-+ if (!flx_decode_chunks (flxdec,
-+ ((FlxFrameType *) chunk)->chunks,
-+ chunk + FlxFrameTypeSize, flxdec->frame_data)) {
-+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE,
-+ ("%s", "Could not decode chunk"), NULL);
-+ return GST_FLOW_ERROR;
-+ }
-
- /* save copy of the current frame for possible delta. */
- memcpy (flxdec->delta_data, flxdec->frame_data, flxdec->size);
---
-2.10.2
-
diff --git a/gnu/packages/patches/icecat-CVE-2016-9064.patch b/gnu/packages/patches/icecat-CVE-2016-9064.patch
deleted file mode 100644
index a5393815e0..0000000000
--- a/gnu/packages/patches/icecat-CVE-2016-9064.patch
+++ /dev/null
@@ -1,996 +0,0 @@
-Copied from
-<https://hg.mozilla.org/releases/mozilla-esr45/raw-rev/00c2b7baaa0b>
-but with one hunk omitted: the git binary patch for
-toolkit/mozapps/extensions/test/addons/test_update_multi2/addon.xpi
-which is not present in the IceCat sources.
-
-# HG changeset patch
-# User Andrew Swan <aswan@mozilla.com>
-# Date 1474063218 25200
-# Node ID 00c2b7baaa0b4bfb7d5f1aac31c094ea6b255e1f
-# Parent 46b07bdbf8b20cf3fdc28104add57ff58a55832b
-Bug 1303418 - Don't allow upgrades that change the addon ID. r=mossop, a=lizzard
-
-MozReview-Commit-ID: JHINo8ShmeI
-
-diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm
---- a/toolkit/mozapps/extensions/AddonManager.jsm
-+++ b/toolkit/mozapps/extensions/AddonManager.jsm
-@@ -2956,16 +2956,18 @@ this.AddonManager = {
- // The downloaded file seems to be corrupted in some way.
- ERROR_CORRUPT_FILE: -3,
- // An error occured trying to write to the filesystem.
- ERROR_FILE_ACCESS: -4,
- // The add-on must be signed and isn't.
- ERROR_SIGNEDSTATE_REQUIRED: -5,
- // The downloaded add-on had a different type than expected.
- ERROR_UNEXPECTED_ADDON_TYPE: -6,
-+ // The addon did not have the expected ID
-+ ERROR_INCORRECT_ID: -7,
-
- // These must be kept in sync with AddonUpdateChecker.
- // No error was encountered.
- UPDATE_STATUS_NO_ERROR: 0,
- // The update check timed out
- UPDATE_STATUS_TIMEOUT: -1,
- // There was an error while downloading the update information.
- UPDATE_STATUS_DOWNLOAD_ERROR: -2,
-diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
---- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
-+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
-@@ -5473,16 +5473,37 @@ AddonInstall.prototype = {
- // loadManifestFromZipReader performs the certificate verification for us
- this.addon = yield loadManifestFromZipReader(zipreader, this.installLocation);
- }
- catch (e) {
- zipreader.close();
- return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, e]);
- }
-
-+ if (this.existingAddon) {
-+ // Check various conditions related to upgrades
-+ if (this.addon.id != this.existingAddon.id) {
-+ zipreader.close();
-+ return Promise.reject([AddonManager.ERROR_INCORRECT_ID,
-+ `Refusing to upgrade addon ${this.existingAddon.id} to different ID ${this.addon.id}`]);
-+ }
-+
-+ if (this.addon.type == "multipackage") {
-+ zipreader.close();
-+ return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
-+ `Refusing to upgrade addon ${this.existingAddon.id} to a multi-package xpi`]);
-+ }
-+
-+ if (this.existingAddon.type == "webextension" && this.addon.type != "webextension") {
-+ zipreader.close();
-+ return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
-+ "Webextensions may not be updated to other extension types"]);
-+ }
-+ }
-+
- if (mustSign(this.addon.type)) {
- if (this.addon.signedState <= AddonManager.SIGNEDSTATE_MISSING) {
- // This add-on isn't properly signed by a signature that chains to the
- // trusted root.
- let state = this.addon.signedState;
- this.addon = null;
- zipreader.close();
-
-@@ -5510,23 +5531,16 @@ AddonInstall.prototype = {
- } else {
- zipreader.close();
- return Promise.reject([AddonManager.ERROR_CORRUPT_FILE,
- "XPI is incorrectly signed"]);
- }
- }
- }
-
-- if (this.existingAddon && this.existingAddon.type == "webextension" &&
-- this.addon.type != "webextension") {
-- zipreader.close();
-- return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
-- "WebExtensions may not be upated to other extension types"]);
-- }
--
- if (this.addon.type == "multipackage")
- return this._loadMultipackageManifests(zipreader);
-
- zipreader.close();
-
- this.updateAddonURIs();
-
- this.addon._install = this;
-@@ -5791,16 +5805,17 @@ AddonInstall.prototype = {
- else {
- // TODO Should we send some event here (bug 557716)?
- this.state = AddonManager.STATE_CHECKING;
- new UpdateChecker(this.addon, {
- onUpdateFinished: aAddon => this.downloadCompleted(),
- }, AddonManager.UPDATE_WHEN_ADDON_INSTALLED);
- }
- }, ([error, message]) => {
-+ this.removeTemporaryFile();
- this.downloadFailed(error, message);
- });
- }
- else {
- if (aRequest instanceof Ci.nsIHttpChannel)
- this.downloadFailed(AddonManager.ERROR_NETWORK_FAILURE,
- aRequest.responseStatus + " " +
- aRequest.responseStatusText);
-diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js
-@@ -0,0 +1,5 @@
-+
-+function install(data, reason) {}
-+function startup(data, reason) {}
-+function shutdown(data, reason) {}
-+function uninstall(data, reason) {}
-diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf
-@@ -0,0 +1,16 @@
-+<?xml version="1.0"?>
-+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-+<Description about="urn:mozilla:install-manifest">
-+ <em:id>updatemulti@tests.mozilla.org</em:id>
-+ <em:version>1.0</em:version>
-+ <em:updateURL>http://localhost:4444/data/test_update_multi.rdf</em:updateURL>
-+ <em:bootstrap>true</em:bootstrap>
-+ <em:name>Test Addon 1</em:name>
-+<em:targetApplication><Description>
-+ <em:id>xpcshell@tests.mozilla.org</em:id>
-+ <em:minVersion>1</em:minVersion>
-+ <em:maxVersion>1</em:maxVersion>
-+</Description></em:targetApplication>
-+</Description>
-+</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf
-@@ -0,0 +1,9 @@
-+<?xml version="1.0"?>
-+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-+<Description about="urn:mozilla:install-manifest">
-+ <em:id>updatemulti@tests.mozilla.org</em:id>
-+ <em:type>32</em:type>
-+ <em:version>2.0</em:version>
-+</Description>
-+</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js
-@@ -0,0 +1,5 @@
-+
-+function install(data, reason) {}
-+function startup(data, reason) {}
-+function shutdown(data, reason) {}
-+function uninstall(data, reason) {}
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf
-@@ -0,0 +1,16 @@
-+<?xml version="1.0"?>
-+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-+<Description about="urn:mozilla:install-manifest">
-+ <em:id>addon1@tests.mozilla.org</em:id>
-+ <em:version>1.0</em:version>
-+ <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
-+ <em:bootstrap>true</em:bootstrap>
-+ <em:name>Test Addon 1</em:name>
-+<em:targetApplication><Description>
-+ <em:id>xpcshell@tests.mozilla.org</em:id>
-+ <em:minVersion>1</em:minVersion>
-+ <em:maxVersion>1</em:maxVersion>
-+</Description></em:targetApplication>
-+</Description>
-+</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js
-@@ -0,0 +1,5 @@
-+
-+function install(data, reason) {}
-+function startup(data, reason) {}
-+function shutdown(data, reason) {}
-+function uninstall(data, reason) {}
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf
-@@ -0,0 +1,16 @@
-+<?xml version="1.0"?>
-+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-+<Description about="urn:mozilla:install-manifest">
-+ <em:id>addon1.changed@tests.mozilla.org</em:id>
-+ <em:version>2.0</em:version>
-+ <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
-+ <em:bootstrap>true</em:bootstrap>
-+ <em:name>Test Addon 1</em:name>
-+<em:targetApplication><Description>
-+ <em:id>xpcshell@tests.mozilla.org</em:id>
-+ <em:minVersion>1</em:minVersion>
-+ <em:maxVersion>1</em:maxVersion>
-+</Description></em:targetApplication>
-+</Description>
-+</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf
-deleted file mode 100644
---- a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf
-+++ /dev/null
-@@ -1,24 +0,0 @@
--<?xml version="1.0"?>
--
--<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-- xmlns:em="http://www.mozilla.org/2004/em-rdf#">
--
-- <Description about="urn:mozilla:install-manifest">
-- <em:id>addon2@tests.mozilla.org</em:id>
-- <em:version>2.0</em:version>
-- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
--
-- <!-- Front End MetaData -->
-- <em:name>Test 2</em:name>
-- <em:description>Test Description</em:description>
--
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- </Description>
-- </em:targetApplication>
--
-- </Description>
--</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf
-deleted file mode 100644
---- a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf
-+++ /dev/null
-@@ -1,24 +0,0 @@
--<?xml version="1.0"?>
--
--<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-- xmlns:em="http://www.mozilla.org/2004/em-rdf#">
--
-- <Description about="urn:mozilla:install-manifest">
-- <em:id>addon2@tests.mozilla.org</em:id>
-- <em:version>5.0</em:version>
-- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
--
-- <!-- Front End MetaData -->
-- <em:name>Test 2</em:name>
-- <em:description>Test Description</em:description>
--
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- </Description>
-- </em:targetApplication>
--
-- </Description>
--</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js
-deleted file mode 100644
---- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js
-+++ /dev/null
-@@ -1,21 +0,0 @@
--Components.utils.import("resource://gre/modules/Services.jsm");
--
--function install(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.installed_version", 3);
-- Services.prefs.setIntPref("bootstraptest.install_reason", reason);
--}
--
--function startup(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.active_version", 3);
-- Services.prefs.setIntPref("bootstraptest.startup_reason", reason);
--}
--
--function shutdown(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.active_version", 0);
-- Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason);
--}
--
--function uninstall(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.installed_version", 0);
-- Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason);
--}
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf
-deleted file mode 100644
---- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf
-+++ /dev/null
-@@ -1,25 +0,0 @@
--<?xml version="1.0"?>
--
--<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-- xmlns:em="http://www.mozilla.org/2004/em-rdf#">
--
-- <Description about="urn:mozilla:install-manifest">
-- <em:id>addon3@tests.mozilla.org</em:id>
-- <em:version>3.0</em:version>
-- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
-- <em:bootstrap>true</em:bootstrap>
--
-- <!-- Front End MetaData -->
-- <em:name>Test 3</em:name>
-- <em:description>Test Description</em:description>
--
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- </Description>
-- </em:targetApplication>
--
-- </Description>
--</RDF>
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js
-deleted file mode 100644
---- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js
-+++ /dev/null
-@@ -1,21 +0,0 @@
--Components.utils.import("resource://gre/modules/Services.jsm");
--
--function install(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.installed_version", 4);
-- Services.prefs.setIntPref("bootstraptest.install_reason", reason);
--}
--
--function startup(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.active_version", 4);
-- Services.prefs.setIntPref("bootstraptest.startup_reason", reason);
--}
--
--function shutdown(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.active_version", 0);
-- Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason);
--}
--
--function uninstall(data, reason) {
-- Services.prefs.setIntPref("bootstraptest.installed_version", 0);
-- Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason);
--}
-diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf
-deleted file mode 100644
---- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf
-+++ /dev/null
-@@ -1,25 +0,0 @@
--<?xml version="1.0"?>
--
--<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-- xmlns:em="http://www.mozilla.org/2004/em-rdf#">
--
-- <Description about="urn:mozilla:install-manifest">
-- <em:id>addon4@tests.mozilla.org</em:id>
-- <em:version>4.0</em:version>
-- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
-- <em:bootstrap>true</em:bootstrap>
--
-- <!-- Front End MetaData -->
-- <em:name>Test 4</em:name>
-- <em:description>Test Description</em:description>
--
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- </Description>
-- </em:targetApplication>
--
-- </Description>
--</RDF>
-diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf
-new file mode 100644
---- /dev/null
-+++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf
-@@ -0,0 +1,26 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+
-+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-+
-+ <Description about="urn:mozilla:extension:updatemulti@tests.mozilla.org">
-+ <em:updates>
-+ <Seq>
-+ <li>
-+ <Description>
-+ <em:version>2.0</em:version>
-+ <em:targetApplication>
-+ <Description>
-+ <em:id>xpcshell@tests.mozilla.org</em:id>
-+ <em:minVersion>1</em:minVersion>
-+ <em:maxVersion>1</em:maxVersion>
-+ <em:updateLink>http://localhost:4444/addons/test_update_multi2.xpi</em:updateLink>
-+ </Description>
-+ </em:targetApplication>
-+ </Description>
-+ </li>
-+ </Seq>
-+ </em:updates>
-+ </Description>
-+
-+</RDF>
-diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf
---- a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf
-+++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf
-@@ -9,77 +9,17 @@
- <li>
- <Description>
- <em:version>2.0</em:version>
- <em:targetApplication>
- <Description>
- <em:id>xpcshell@tests.mozilla.org</em:id>
- <em:minVersion>1</em:minVersion>
- <em:maxVersion>1</em:maxVersion>
-- <em:updateLink>http://localhost:4444/addons/test_updateid2_2.xpi</em:updateLink>
-- </Description>
-- </em:targetApplication>
-- </Description>
-- </li>
-- </Seq>
-- </em:updates>
-- </Description>
--
-- <Description about="urn:mozilla:extension:addon2@tests.mozilla.org">
-- <em:updates>
-- <Seq>
-- <li>
-- <Description>
-- <em:version>3.0</em:version>
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- <em:updateLink>http://localhost:4444/addons/test_updateid3_3.xpi</em:updateLink>
-- </Description>
-- </em:targetApplication>
-- </Description>
-- </li>
-- </Seq>
-- </em:updates>
-- </Description>
--
-- <Description about="urn:mozilla:extension:addon3@tests.mozilla.org">
-- <em:updates>
-- <Seq>
-- <li>
-- <Description>
-- <em:version>4.0</em:version>
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- <em:updateLink>http://localhost:4444/addons/test_updateid4_4.xpi</em:updateLink>
-- </Description>
-- </em:targetApplication>
-- </Description>
-- </li>
-- </Seq>
-- </em:updates>
-- </Description>
--
-- <Description about="urn:mozilla:extension:addon4@tests.mozilla.org">
-- <em:updates>
-- <Seq>
-- <li>
-- <Description>
-- <em:version>5.0</em:version>
-- <em:targetApplication>
-- <Description>
-- <em:id>xpcshell@tests.mozilla.org</em:id>
-- <em:minVersion>1</em:minVersion>
-- <em:maxVersion>1</em:maxVersion>
-- <em:updateLink>http://localhost:4444/addons/test_updateid2_5.xpi</em:updateLink>
-+ <em:updateLink>http://localhost:4444/addons/test_updateid2.xpi</em:updateLink>
- </Description>
- </em:targetApplication>
- </Description>
- </li>
- </Seq>
- </em:updates>
- </Description>
-
-diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js
---- a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js
-+++ b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js
-@@ -2,421 +2,85 @@
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
- // This verifies that updating an add-on to a new ID works
-
- // The test extension uses an insecure update url.
- Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false);
-
--Components.utils.import("resource://testing-common/httpd.js");
--var testserver;
- const profileDir = gProfD.clone();
- profileDir.append("extensions");
-
--function resetPrefs() {
-- Services.prefs.setIntPref("bootstraptest.active_version", -1);
-- Services.prefs.setIntPref("bootstraptest.installed_version", -1);
-- Services.prefs.setIntPref("bootstraptest.startup_reason", -1);
-- Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1);
-- Services.prefs.setIntPref("bootstraptest.install_reason", -1);
-- Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1);
--}
--
--function getActiveVersion() {
-- return Services.prefs.getIntPref("bootstraptest.active_version");
--}
--
--function getInstalledVersion() {
-- return Services.prefs.getIntPref("bootstraptest.installed_version");
--}
--
--function run_test() {
-- createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
--
-- // Create and configure the HTTP server.
-- testserver = new HttpServer();
-- testserver.registerDirectory("/data/", do_get_file("data"));
-- testserver.registerDirectory("/addons/", do_get_file("addons"));
-- testserver.start(4444);
--
-- do_test_pending();
-- run_test_1();
--}
--
--function end_test() {
-- testserver.stop(do_test_finished);
--}
--
--function installUpdate(aInstall, aCallback) {
-- aInstall.addListener({
-- onInstallEnded: function(aInstall) {
-- // give the startup time to run
-- do_execute_soon(function() {
-- aCallback(aInstall);
-- });
-- }
-- });
--
-- aInstall.install();
--}
--
--// Verify that an update to an add-on with a new ID uninstalls the old add-on
--function run_test_1() {
-- writeInstallRDFForExtension({
-- id: "addon1@tests.mozilla.org",
-- version: "1.0",
-- updateURL: "http://localhost:4444/data/test_updateid.rdf",
-- targetApplications: [{
-- id: "xpcshell@tests.mozilla.org",
-- minVersion: "1",
-- maxVersion: "1"
-- }],
-- name: "Test Addon 1",
-- }, profileDir);
--
-- startupManager();
--
-- AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
-- do_check_neq(a1, null);
-- do_check_eq(a1.version, "1.0");
-+function promiseInstallUpdate(install) {
-+ return new Promise((resolve, reject) => {
-+ install.addListener({
-+ onDownloadFailed: () => {
-+ let err = new Error("download error");
-+ err.code = install.error;
-+ reject(err);
-+ },
-+ onInstallFailed: () => {
-+ let err = new Error("install error");
-+ err.code = install.error;
-+ reject(err);
-+ },
-+ onInstallEnded: resolve,
-+ });
-
-- a1.findUpdates({
-- onUpdateAvailable: function(addon, install) {
-- do_check_eq(install.name, addon.name);
-- do_check_eq(install.version, "2.0");
-- do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
-- do_check_eq(install.existingAddon, a1);
--
-- installUpdate(install, check_test_1);
-- }
-- }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-- });
--}
--
--function check_test_1(install) {
-- AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
-- // Existing add-on should have a pending upgrade
-- do_check_neq(a1.pendingUpgrade, null);
-- do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org");
-- do_check_eq(a1.pendingUpgrade.install.existingAddon, a1);
-- do_check_neq(a1.syncGUID);
--
-- let a1SyncGUID = a1.syncGUID;
--
-- restartManager();
--
-- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-- "addon2@tests.mozilla.org"], function([a1, a2]) {
-- // Should have uninstalled the old and installed the new
-- do_check_eq(a1, null);
-- do_check_neq(a2, null);
-- do_check_neq(a2.syncGUID, null);
--
-- // The Sync GUID should change when the ID changes
-- do_check_neq(a1SyncGUID, a2.syncGUID);
--
-- a2.uninstall();
--
-- do_execute_soon(run_test_2);
-- });
-- }));
--}
--
--// Test that when the new add-on already exists we just upgrade that
--function run_test_2() {
-- restartManager();
-- shutdownManager();
--
-- writeInstallRDFForExtension({
-- id: "addon1@tests.mozilla.org",
-- version: "1.0",
-- updateURL: "http://localhost:4444/data/test_updateid.rdf",
-- targetApplications: [{
-- id: "xpcshell@tests.mozilla.org",
-- minVersion: "1",
-- maxVersion: "1"
-- }],
-- name: "Test Addon 1",
-- }, profileDir);
-- writeInstallRDFForExtension({
-- id: "addon2@tests.mozilla.org",
-- version: "1.0",
-- targetApplications: [{
-- id: "xpcshell@tests.mozilla.org",
-- minVersion: "1",
-- maxVersion: "1"
-- }],
-- name: "Test Addon 2",
-- }, profileDir);
--
-- startupManager();
--
-- AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
-- do_check_neq(a1, null);
-- do_check_eq(a1.version, "1.0");
--
-- a1.findUpdates({
-- onUpdateAvailable: function(addon, install) {
-- installUpdate(install, check_test_2);
-- }
-- }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-+ install.install();
- });
- }
-
--function check_test_2(install) {
-- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-- "addon2@tests.mozilla.org"],
-- callback_soon(function([a1, a2]) {
-- do_check_eq(a1.pendingUpgrade, null);
-- // Existing add-on should have a pending upgrade
-- do_check_neq(a2.pendingUpgrade, null);
-- do_check_eq(a2.pendingUpgrade.id, "addon2@tests.mozilla.org");
-- do_check_eq(a2.pendingUpgrade.install.existingAddon, a2);
--
-- restartManager();
--
-- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-- "addon2@tests.mozilla.org"], function([a1, a2]) {
-- // Should have uninstalled the old and installed the new
-- do_check_neq(a1, null);
-- do_check_neq(a2, null);
--
-- a1.uninstall();
-- a2.uninstall();
--
-- do_execute_soon(run_test_3);
-- });
-- }));
--}
--
--// Test that we rollback correctly when removing the old add-on fails
--function run_test_3() {
-- restartManager();
-- shutdownManager();
--
-- // This test only works on Windows
-- if (!("nsIWindowsRegKey" in AM_Ci)) {
-- run_test_4();
-- return;
-- }
--
-- writeInstallRDFForExtension({
-- id: "addon1@tests.mozilla.org",
-- version: "1.0",
-- updateURL: "http://localhost:4444/data/test_updateid.rdf",
-- targetApplications: [{
-- id: "xpcshell@tests.mozilla.org",
-- minVersion: "1",
-- maxVersion: "1"
-- }],
-- name: "Test Addon 1",
-- }, profileDir);
--
-- startupManager();
-+// Create and configure the HTTP server.
-+let testserver = createHttpServer(4444);
-+testserver.registerDirectory("/data/", do_get_file("data"));
-+testserver.registerDirectory("/addons/", do_get_file("addons"));
-
-- AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
-- do_check_neq(a1, null);
-- do_check_eq(a1.version, "1.0");
--
-- a1.findUpdates({
-- onUpdateAvailable: function(addon, install) {
-- installUpdate(install, check_test_3);
-- }
-- }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-- });
--}
--
--function check_test_3(install) {
-- AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
-- // Existing add-on should have a pending upgrade
-- do_check_neq(a1.pendingUpgrade, null);
-- do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org");
-- do_check_eq(a1.pendingUpgrade.install.existingAddon, a1);
--
-- // Lock the old add-on open so it can't be uninstalled
-- var file = profileDir.clone();
-- file.append("addon1@tests.mozilla.org");
-- if (!file.exists())
-- file.leafName += ".xpi";
-- else
-- file.append("install.rdf");
--
-- var fstream = AM_Cc["@mozilla.org/network/file-output-stream;1"].
-- createInstance(AM_Ci.nsIFileOutputStream);
-- fstream.init(file, FileUtils.MODE_APPEND | FileUtils.MODE_WRONLY, FileUtils.PERMS_FILE, 0);
--
-- restartManager();
--
-- fstream.close();
--
-- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-- "addon2@tests.mozilla.org"],
-- callback_soon(function([a1, a2]) {
-- // Should not have installed the new add-on but it should still be
-- // pending install
-- do_check_neq(a1, null);
-- do_check_eq(a2, null);
--
-- restartManager();
--
-- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
-- "addon2@tests.mozilla.org"], function([a1, a2]) {
-- // Should have installed the new add-on
-- do_check_eq(a1, null);
-- do_check_neq(a2, null);
--
-- a2.uninstall();
--
-- do_execute_soon(run_test_4);
-- });
-- }));
-- }));
-+function run_test() {
-+ createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
-+ startupManager();
-+ run_next_test();
- }
-
--// Tests that upgrading to a bootstrapped add-on works but requires a restart
--function run_test_4() {
-- restartManager();
-- shutdownManager();
--
-- writeInstallRDFForExtension({
-- id: "addon2@tests.mozilla.org",
-- version: "2.0",
-- updateURL: "http://localhost:4444/data/test_updateid.rdf",
-- targetApplications: [{
-- id: "xpcshell@tests.mozilla.org",
-- minVersion: "1",
-- maxVersion: "1"
-- }],
-- name: "Test Addon 2",
-- }, profileDir);
--
-- startupManager();
--
-- resetPrefs();
--
-- AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
-- do_check_neq(a2, null);
-- do_check_neq(a2.syncGUID, null);
-- do_check_eq(a2.version, "2.0");
--
-- a2.findUpdates({
-- onUpdateAvailable: function(addon, install) {
-- installUpdate(install, check_test_4);
-- }
-- }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-- });
--}
--
--function check_test_4() {
-- AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org",
-- "addon3@tests.mozilla.org"],
-- callback_soon(function([a2, a3]) {
-- // Should still be pending install even though the new add-on is restartless
-- do_check_neq(a2, null);
-- do_check_eq(a3, null);
--
-- do_check_neq(a2.pendingUpgrade, null);
-- do_check_eq(a2.pendingUpgrade.id, "addon3@tests.mozilla.org");
--
-- do_check_eq(getInstalledVersion(), -1);
-- do_check_eq(getActiveVersion(), -1);
--
-- restartManager();
--
-- AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org",
-- "addon3@tests.mozilla.org"], function([a2, a3]) {
-- // Should have updated
-- do_check_eq(a2, null);
-- do_check_neq(a3, null);
--
-- do_check_eq(getInstalledVersion(), 3);
-- do_check_eq(getActiveVersion(), 3);
--
-- do_execute_soon(run_test_5);
-- });
-- }));
--}
--
--// Tests that upgrading to another bootstrapped add-on works without a restart
--function run_test_5() {
-- AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
-- do_check_neq(a3, null);
-- do_check_eq(a3.version, "3.0");
-+// Verify that an update to an add-on with a new ID fails
-+add_task(function* test_update_new_id() {
-+ yield promiseInstallAllFiles([do_get_addon("test_updateid1")]);
-
-- a3.findUpdates({
-- onUpdateAvailable: function(addon, install) {
-- installUpdate(install, check_test_5);
-- }
-- }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-- });
--}
--
--function check_test_5() {
-- AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org",
-- "addon4@tests.mozilla.org"],
-- callback_soon(function([a3, a4]) {
-- // Should have updated
-- do_check_eq(a3, null);
-- do_check_neq(a4, null);
--
-- do_check_eq(getInstalledVersion(), 4);
-- do_check_eq(getActiveVersion(), 4);
--
-- restartManager();
--
-- AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org",
-- "addon4@tests.mozilla.org"], function([a3, a4]) {
-- // Should still be gone
-- do_check_eq(a3, null);
-- do_check_neq(a4, null);
--
-- do_check_eq(getInstalledVersion(), 4);
-- do_check_eq(getActiveVersion(), 4);
--
-- run_test_6();
-- });
-- }));
--}
-+ let addon = yield promiseAddonByID("addon1@tests.mozilla.org");
-+ do_check_neq(addon, null);
-+ do_check_eq(addon.version, "1.0");
-
--// Tests that upgrading to a non-bootstrapped add-on works but requires a restart
--function run_test_6() {
-- AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) {
-- do_check_neq(a4, null);
-- do_check_eq(a4.version, "4.0");
--
-- a4.findUpdates({
-- onUpdateAvailable: function(addon, install) {
-- installUpdate(install, check_test_6);
-- }
-- }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-- });
--}
-+ let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-+ let install = update.updateAvailable;
-+ do_check_eq(install.name, addon.name);
-+ do_check_eq(install.version, "2.0");
-+ do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
-+ do_check_eq(install.existingAddon, addon);
-
--function check_test_6() {
-- AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
-- "addon2@tests.mozilla.org"],
-- callback_soon(function([a4, a2]) {
-- // Should still be pending install even though the old add-on is restartless
-- do_check_neq(a4, null);
-- do_check_eq(a2, null);
--
-- do_check_neq(a4.pendingUpgrade, null);
-- do_check_eq(a4.pendingUpgrade.id, "addon2@tests.mozilla.org");
--
-- do_check_eq(getInstalledVersion(), 4);
-- do_check_eq(getActiveVersion(), 4);
-+ yield Assert.rejects(promiseInstallUpdate(install),
-+ function(err) { return err.code == AddonManager.ERROR_INCORRECT_ID },
-+ "Upgrade to a different ID fails");
-
-- restartManager();
-+ addon.uninstall();
-+});
-
-- AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
-- "addon2@tests.mozilla.org"], function([a4, a2]) {
-- // Should have updated
-- do_check_eq(a4, null);
-- do_check_neq(a2, null);
-+// Verify that an update to a multi-package xpi fails
-+add_task(function* test_update_new_id() {
-+ yield promiseInstallAllFiles([do_get_addon("test_update_multi1")]);
-
-- do_check_eq(getInstalledVersion(), 0);
-- do_check_eq(getActiveVersion(), 0);
-+ let addon = yield promiseAddonByID("updatemulti@tests.mozilla.org");
-+ do_check_neq(addon, null);
-+ do_check_eq(addon.version, "1.0");
-
-- end_test();
-- });
-- }));
--}
-+ let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED);
-+ let install = update.updateAvailable;
-+ do_check_eq(install.name, addon.name);
-+ do_check_eq(install.version, "2.0");
-+ do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
-+ do_check_eq(install.existingAddon, addon);
-+
-+ yield Assert.rejects(promiseInstallUpdate(install),
-+ function(err) { return err.code == AddonManager.ERROR_UNEXPECTED_ADDON_TYPE },
-+ "Upgrade to a multipackage xpi fails");
-+
-+ addon.uninstall();
-+});
-
diff --git a/gnu/packages/patches/nasm-no-ps-pdf.patch b/gnu/packages/patches/nasm-no-ps-pdf.patch
deleted file mode 100644
index b03b57a6ed..0000000000
--- a/gnu/packages/patches/nasm-no-ps-pdf.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-Avoid building PS and PDF docs, which do not build bit-reproducible. NASM
-already installs doc in info and html.
-
---- nasm-2.12.01/doc/Makefile.in.orig 2016-06-21 18:02:59.483484829 +0200
-+++ nasm-2.12.01/doc/Makefile.in 2016-06-21 18:03:46.700151410 +0200
-@@ -27,7 +27,7 @@
- PS2PDF = @PS2PDF@ # Part of GhostScript
-
- SRCS = nasmdoc.src inslist.src changes.src
--OUT = info html nasmdoc.txt nasmdoc.ps nasmdoc.pdf
-+OUT = info html nasmdoc.txt
-
- # exports
- export srcdir
-@@ -100,4 +100,4 @@
- $(INSTALL_DATA) info/* $(INSTALLROOT)$(infodir)
- mkdir -p $(INSTALLROOT)$(docdir)/html
- $(INSTALL_DATA) html/* $(INSTALLROOT)$(docdir)/html
-- $(INSTALL_DATA) nasmdoc.ps nasmdoc.pdf nasmdoc.txt $(INSTALLROOT)$(docdir)
-+ $(INSTALL_DATA) nasmdoc.txt $(INSTALLROOT)$(docdir)
diff --git a/gnu/packages/patches/netcdf-config-date.patch b/gnu/packages/patches/netcdf-config-date.patch
deleted file mode 100644
index 5054612e95..0000000000
--- a/gnu/packages/patches/netcdf-config-date.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-Honor SOURCE_DATE_EPOCH when exporting configuration date.
-Autoconf-level patch submitted upstream on Fri Apr 15 23:07:42 UTC 2016
-
---- a/configure
-+++ b/configure
-@@ -2866,7 +2866,17 @@
-
-
- # Configuration Date
-- CONFIG_DATE="`date`"
-+ CONFIG_DATE="`date -u`"
-+if test -n "$SOURCE_DATE_EPOCH"; then
-+ CONFIG_DATE=`date -u -d "@$SOURCE_DATE_EPOCH" 2>/dev/null \
-+ || date -u -r "$SOURCE_DATE_EPOCH" 2>/dev/null`
-+ if test -z "$CONFIG_DATE"; then
-+ as_fn_error $? "malformed SOURCE_DATE_EPOCH" "$LINENO" 5
-+ fi
-+fi
-+cat >>confdefs.h <<_ACEOF
-+#define CONFIG_DATE "$CONFIG_DATE"
-+_ACEOF
-
- # Find out about the host we're building on.
- ac_aux_dir=
---- a/libdispatch/derror.c
-+++ b/libdispatch/derror.c
-@@ -13,7 +13,7 @@
- #endif
-
- /* Tell the user the version of netCDF. */
--static const char nc_libvers[] = PACKAGE_VERSION " of "__DATE__" "__TIME__" $";
-+static const char nc_libvers[] = PACKAGE_VERSION " of "CONFIG_DATE" $";
-
- /**
- \defgroup lib_version Library Version
---- a/config.h.in
-+++ b/config.h.in
-@@ -393,6 +393,9 @@
- /* Define to the version of this package. */
- #undef PACKAGE_VERSION
-
-+/* Define to the configuration date */
-+#undef CONFIG_DATE
-+
- /* The size of `double', as computed by sizeof. */
- #undef SIZEOF_DOUBLE
-
diff --git a/gnu/packages/patches/netcdf-date-time.patch b/gnu/packages/patches/netcdf-date-time.patch
new file mode 100644
index 0000000000..a4e7925aa1
--- /dev/null
+++ b/gnu/packages/patches/netcdf-date-time.patch
@@ -0,0 +1,11 @@
+--- a/libdispatch/derror.c
++++ b/libdispatch/derror.c
+@@ -13,7 +13,7 @@
+ #endif
+
+ /* Tell the user the version of netCDF. */
+-static const char nc_libvers[] = PACKAGE_VERSION " of "__DATE__" "__TIME__" $";
++static const char nc_libvers[] = PACKAGE_VERSION" $";
+
+ /**
+ \defgroup lib_version Library Version
diff --git a/gnu/packages/patches/netcdf-tst_h_par.patch b/gnu/packages/patches/netcdf-tst_h_par.patch
new file mode 100644
index 0000000000..ac14a4c0a2
--- /dev/null
+++ b/gnu/packages/patches/netcdf-tst_h_par.patch
@@ -0,0 +1,21 @@
+From a83702834938b23cc2e843589aa223e2024a7e6f Mon Sep 17 00:00:00 2001
+From: Orion Poplawski <orion@cora.nwra.com>
+Date: Tue, 29 Nov 2016 11:48:01 -0700
+Subject: [PATCH] Add missing #include "err_macros.h" to tst_h_par.c
+
+---
+ h5_test/tst_h_par.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/h5_test/tst_h_par.c b/h5_test/tst_h_par.c
+index c3da7f4..a419d55 100644
+--- a/h5_test/tst_h_par.c
++++ b/h5_test/tst_h_par.c
+@@ -11,6 +11,7 @@
+ $Id: tst_h_par.c,v 1.15 2010/05/25 13:53:04 ed Exp $
+ */
+ #include <nc_tests.h>
++#include "err_macros.h"
+ #include <hdf5.h>
+
+ /* Defining USE_MPE causes the MPE trace library to be used (and you
diff --git a/gnu/packages/patches/vtk-mesa-10.patch b/gnu/packages/patches/vtk-mesa-10.patch
deleted file mode 100644
index bc60af68c4..0000000000
--- a/gnu/packages/patches/vtk-mesa-10.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-Fix build against new mesa. See:
-
- https://bugs.freedesktop.org/show_bug.cgi?id=83631
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765938
-
-Description: fixes FTBFS against new libjpeg-turbo
-Author: Ondřej Surý <ondrej@debian.org>
-Bug-Debian: https://bugs.debian.org/765938
-Reviewed-By: Anton Gladky <gladk@debian.org>
-Last-Update: 2014-10-22
-
-Index: vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkOpenGL.h
-===================================================================
---- vtk6-6.1.0+dfsg2.orig/Rendering/OpenGL/vtkOpenGL.h
-+++ vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkOpenGL.h
-@@ -20,6 +20,7 @@
-
- // To prevent gl.h to include glext.h provided by the system
- #define GL_GLEXT_LEGACY
-+#define GLX_GLEXT_LEGACY
- #if defined(__APPLE__) && (defined(VTK_USE_CARBON) || defined(VTK_USE_COCOA))
- # include <OpenGL/gl.h> // Include OpenGL API.
- #else
-Index: vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkXOpenGLRenderWindow.cxx
-===================================================================
---- vtk6-6.1.0+dfsg2.orig/Rendering/OpenGL/vtkXOpenGLRenderWindow.cxx
-+++ vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkXOpenGLRenderWindow.cxx
-@@ -27,7 +27,7 @@
-
- // define GLX_GLXEXT_LEGACY to prevent glx.h to include glxext.h provided by
- // the system
--//#define GLX_GLXEXT_LEGACY
-+#define GLX_GLXEXT_LEGACY
- #include "GL/glx.h"
-
- #include "vtkgl.h"