Hello community, here is the log from the commit of package kernel-source for openSUSE:Factory checked in at 2017-03-15 01:05:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kernel-source (Old) and /work/SRC/openSUSE:Factory/.kernel-source.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kernel-source" Wed Mar 15 01:05:26 2017 rev:354 rq:478872 version:4.10.2 Changes: -------- --- /work/SRC/openSUSE:Factory/kernel-source/dtb-aarch64.changes 2017-03-10 20:53:43.333530872 +0100 +++ /work/SRC/openSUSE:Factory/.kernel-source.new/dtb-aarch64.changes 2017-03-15 01:59:50.736145332 +0100 @@ -1,0 +2,13 @@ +Sun Mar 12 20:54:41 CET 2017 - jsl...@suse.cz + +- Linux 4.10.2 (bnc#1012628). +- commit bfb2d22 + +------------------------------------------------------------------- +Thu Mar 9 17:47:56 CET 2017 - jsl...@suse.cz + +- tty: n_hdlc: get rid of racy n_hdlc.tbuf (bnc#1027565 + CVE-2017-2636). +- commit c829304 + +------------------------------------------------------------------- dtb-armv6l.changes: same change dtb-armv7l.changes: same change kernel-64kb.changes: same change kernel-debug.changes: same change kernel-default.changes: same change kernel-docs.changes: same change kernel-lpae.changes: same change kernel-obs-build.changes: same change kernel-obs-qa.changes: same change kernel-pae.changes: same change kernel-source.changes: same change kernel-syms.changes: same change kernel-syzkaller.changes: same change kernel-vanilla.changes: same change ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dtb-aarch64.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:55.823426109 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:55.823426109 +0100 @@ -16,15 +16,15 @@ # -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define vanilla_only 0 %include %_sourcedir/kernel-spec-macros Name: dtb-aarch64 -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif dtb-armv6l.spec: same change dtb-armv7l.spec: same change ++++++ kernel-64kb.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:55.923411973 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:55.923411973 +0100 @@ -18,7 +18,7 @@ %define srcversion 4.10 -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %define vanilla_only 0 @@ -58,9 +58,9 @@ Summary: Kernel with 64kb PAGE_SIZE License: GPL-2.0 Group: System/Kernel -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif kernel-debug.spec: same change kernel-default.spec: same change ++++++ kernel-docs.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.011399534 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.011399534 +0100 @@ -16,7 +16,7 @@ # -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %include %_sourcedir/kernel-spec-macros @@ -42,9 +42,9 @@ Summary: Kernel Documentation (man pages) License: GPL-2.0 Group: Documentation/Man -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-lpae.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.039395576 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.043395010 +0100 @@ -18,7 +18,7 @@ %define srcversion 4.10 -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %define vanilla_only 0 @@ -58,9 +58,9 @@ Summary: Kernel for LPAE enabled systems License: GPL-2.0 Group: System/Kernel -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-obs-build.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.063392184 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.067391618 +0100 @@ -19,7 +19,7 @@ #!BuildIgnore: post-build-checks -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %define vanilla_only 0 @@ -57,9 +57,9 @@ Summary: package kernel and initrd for OBS VM builds License: GPL-2.0 Group: SLES -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-obs-qa.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.095387660 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.099387094 +0100 @@ -17,7 +17,7 @@ # needsrootforbuild -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %include %_sourcedir/kernel-spec-macros @@ -36,9 +36,9 @@ Summary: Basic QA tests for the kernel License: GPL-2.0 Group: SLES -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-pae.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.131382571 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.135382006 +0100 @@ -18,7 +18,7 @@ %define srcversion 4.10 -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %define vanilla_only 0 @@ -58,9 +58,9 @@ Summary: Kernel with PAE Support License: GPL-2.0 Group: System/Kernel -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-source.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.163378048 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.163378048 +0100 @@ -18,7 +18,7 @@ %define srcversion 4.10 -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %define vanilla_only 0 @@ -30,9 +30,9 @@ Summary: The Linux Kernel Sources License: GPL-2.0 Group: Development/Sources -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-syms.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.191374090 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.195373525 +0100 @@ -24,10 +24,10 @@ Summary: Kernel Symbol Versions (modversions) License: GPL-2.0 Group: Development/Sources -Version: 4.10.1 +Version: 4.10.2 %if %using_buildservice %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif ++++++ kernel-syzkaller.spec ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:56.223369566 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:56.227369001 +0100 @@ -18,7 +18,7 @@ %define srcversion 4.10 -%define patchversion 4.10.1 +%define patchversion 4.10.2 %define variant %{nil} %define vanilla_only 0 @@ -58,9 +58,9 @@ Summary: Kernel used for fuzzing by syzkaller License: GPL-2.0 Group: System/Kernel -Version: 4.10.1 +Version: 4.10.2 %if 0%{?is_kotd} -Release: <RELEASE>.gf764d42 +Release: <RELEASE>.gbfb2d22 %else Release: 0 %endif kernel-vanilla.spec: same change ++++++ patches.fixes.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/patches.fixes/tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch new/patches.fixes/tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch --- old/patches.fixes/tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch 1970-01-01 01:00:00.000000000 +0100 +++ new/patches.fixes/tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch 2017-03-09 17:48:39.000000000 +0100 @@ -0,0 +1,312 @@ +From: Alexander Popov <alex.po...@linux.com> +Date: Tue, 28 Feb 2017 19:54:40 +0300 +Subject: tty: n_hdlc: get rid of racy n_hdlc.tbuf +Patch-mainline: v4.11-rc2 +Git-commit: 82f2341c94d270421f383641b7cd670e474db56b +Git-tree: https://git.kernel.org/cgit/linux/kernel/git/gregkh/tty.git +References: bnc#1027565 CVE-2017-2636 + +Currently N_HDLC line discipline uses a self-made singly linked list for +data buffers and has n_hdlc.tbuf pointer for buffer retransmitting after +an error. + +The commit be10eb7589337e5defbe214dae038a53dd21add8 +("tty: n_hdlc add buffer flushing") introduced racy access to n_hdlc.tbuf. +After tx error concurrent flush_tx_queue() and n_hdlc_send_frames() can put +one data buffer to tx_free_buf_list twice. That causes double free in +n_hdlc_release(). + +Let's use standard kernel linked list and get rid of n_hdlc.tbuf: +in case of tx error put current data buffer after the head of tx_buf_list. + +Signed-off-by: Alexander Popov <alex.po...@linux.com> +Cc: stable <sta...@vger.kernel.org> +Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org> +Signed-off-by: Jiri Slaby <jsl...@suse.cz> +--- + drivers/tty/n_hdlc.c | 132 ++++++++++++++++++++++++++------------------------- + 1 file changed, 69 insertions(+), 63 deletions(-) + +--- a/drivers/tty/n_hdlc.c ++++ b/drivers/tty/n_hdlc.c +@@ -114,7 +114,7 @@ + #define DEFAULT_TX_BUF_COUNT 3 + + struct n_hdlc_buf { +- struct n_hdlc_buf *link; ++ struct list_head list_item; + int count; + char buf[1]; + }; +@@ -122,8 +122,7 @@ struct n_hdlc_buf { + #define N_HDLC_BUF_SIZE (sizeof(struct n_hdlc_buf) + maxframe) + + struct n_hdlc_buf_list { +- struct n_hdlc_buf *head; +- struct n_hdlc_buf *tail; ++ struct list_head list; + int count; + spinlock_t spinlock; + }; +@@ -136,7 +135,6 @@ struct n_hdlc_buf_list { + * @backup_tty - TTY to use if tty gets closed + * @tbusy - reentrancy flag for tx wakeup code + * @woke_up - FIXME: describe this field +- * @tbuf - currently transmitting tx buffer + * @tx_buf_list - list of pending transmit frame buffers + * @rx_buf_list - list of received frame buffers + * @tx_free_buf_list - list unused transmit frame buffers +@@ -149,7 +147,6 @@ struct n_hdlc { + struct tty_struct *backup_tty; + int tbusy; + int woke_up; +- struct n_hdlc_buf *tbuf; + struct n_hdlc_buf_list tx_buf_list; + struct n_hdlc_buf_list rx_buf_list; + struct n_hdlc_buf_list tx_free_buf_list; +@@ -159,6 +156,8 @@ struct n_hdlc { + /* + * HDLC buffer list manipulation functions + */ ++static void n_hdlc_buf_return(struct n_hdlc_buf_list *buf_list, ++ struct n_hdlc_buf *buf); + static void n_hdlc_buf_put(struct n_hdlc_buf_list *list, + struct n_hdlc_buf *buf); + static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_buf_list *list); +@@ -208,16 +207,9 @@ static void flush_tx_queue(struct tty_st + { + struct n_hdlc *n_hdlc = tty2n_hdlc(tty); + struct n_hdlc_buf *buf; +- unsigned long flags; + + while ((buf = n_hdlc_buf_get(&n_hdlc->tx_buf_list))) + n_hdlc_buf_put(&n_hdlc->tx_free_buf_list, buf); +- spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock, flags); +- if (n_hdlc->tbuf) { +- n_hdlc_buf_put(&n_hdlc->tx_free_buf_list, n_hdlc->tbuf); +- n_hdlc->tbuf = NULL; +- } +- spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); + } + + static struct tty_ldisc_ops n_hdlc_ldisc = { +@@ -283,7 +275,6 @@ static void n_hdlc_release(struct n_hdlc + } else + break; + } +- kfree(n_hdlc->tbuf); + kfree(n_hdlc); + + } /* end of n_hdlc_release() */ +@@ -402,13 +393,7 @@ static void n_hdlc_send_frames(struct n_ + n_hdlc->woke_up = 0; + spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); + +- /* get current transmit buffer or get new transmit */ +- /* buffer from list of pending transmit buffers */ +- +- tbuf = n_hdlc->tbuf; +- if (!tbuf) +- tbuf = n_hdlc_buf_get(&n_hdlc->tx_buf_list); +- ++ tbuf = n_hdlc_buf_get(&n_hdlc->tx_buf_list); + while (tbuf) { + if (debuglevel >= DEBUG_LEVEL_INFO) + printk("%s(%d)sending frame %p, count=%d\n", +@@ -420,7 +405,7 @@ static void n_hdlc_send_frames(struct n_ + + /* rollback was possible and has been done */ + if (actual == -ERESTARTSYS) { +- n_hdlc->tbuf = tbuf; ++ n_hdlc_buf_return(&n_hdlc->tx_buf_list, tbuf); + break; + } + /* if transmit error, throw frame away by */ +@@ -435,10 +420,7 @@ static void n_hdlc_send_frames(struct n_ + + /* free current transmit buffer */ + n_hdlc_buf_put(&n_hdlc->tx_free_buf_list, tbuf); +- +- /* this tx buffer is done */ +- n_hdlc->tbuf = NULL; +- ++ + /* wait up sleeping writers */ + wake_up_interruptible(&tty->write_wait); + +@@ -448,10 +430,12 @@ static void n_hdlc_send_frames(struct n_ + if (debuglevel >= DEBUG_LEVEL_INFO) + printk("%s(%d)frame %p pending\n", + __FILE__,__LINE__,tbuf); +- +- /* buffer not accepted by driver */ +- /* set this buffer as pending buffer */ +- n_hdlc->tbuf = tbuf; ++ ++ /* ++ * the buffer was not accepted by driver, ++ * return it back into tx queue ++ */ ++ n_hdlc_buf_return(&n_hdlc->tx_buf_list, tbuf); + break; + } + } +@@ -749,7 +733,8 @@ static int n_hdlc_tty_ioctl(struct tty_s + int error = 0; + int count; + unsigned long flags; +- ++ struct n_hdlc_buf *buf = NULL; ++ + if (debuglevel >= DEBUG_LEVEL_INFO) + printk("%s(%d)n_hdlc_tty_ioctl() called %d\n", + __FILE__,__LINE__,cmd); +@@ -763,8 +748,10 @@ static int n_hdlc_tty_ioctl(struct tty_s + /* report count of read data available */ + /* in next available frame (if any) */ + spin_lock_irqsave(&n_hdlc->rx_buf_list.spinlock,flags); +- if (n_hdlc->rx_buf_list.head) +- count = n_hdlc->rx_buf_list.head->count; ++ buf = list_first_entry_or_null(&n_hdlc->rx_buf_list.list, ++ struct n_hdlc_buf, list_item); ++ if (buf) ++ count = buf->count; + else + count = 0; + spin_unlock_irqrestore(&n_hdlc->rx_buf_list.spinlock,flags); +@@ -776,8 +763,10 @@ static int n_hdlc_tty_ioctl(struct tty_s + count = tty_chars_in_buffer(tty); + /* add size of next output frame in queue */ + spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock,flags); +- if (n_hdlc->tx_buf_list.head) +- count += n_hdlc->tx_buf_list.head->count; ++ buf = list_first_entry_or_null(&n_hdlc->tx_buf_list.list, ++ struct n_hdlc_buf, list_item); ++ if (buf) ++ count += buf->count; + spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock,flags); + error = put_user(count, (int __user *)arg); + break; +@@ -825,14 +814,14 @@ static unsigned int n_hdlc_tty_poll(stru + poll_wait(filp, &tty->write_wait, wait); + + /* set bits for operations that won't block */ +- if (n_hdlc->rx_buf_list.head) ++ if (!list_empty(&n_hdlc->rx_buf_list.list)) + mask |= POLLIN | POLLRDNORM; /* readable */ + if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) + mask |= POLLHUP; + if (tty_hung_up_p(filp)) + mask |= POLLHUP; + if (!tty_is_writelocked(tty) && +- n_hdlc->tx_free_buf_list.head) ++ !list_empty(&n_hdlc->tx_free_buf_list.list)) + mask |= POLLOUT | POLLWRNORM; /* writable */ + } + return mask; +@@ -856,7 +845,12 @@ static struct n_hdlc *n_hdlc_alloc(void) + spin_lock_init(&n_hdlc->tx_free_buf_list.spinlock); + spin_lock_init(&n_hdlc->rx_buf_list.spinlock); + spin_lock_init(&n_hdlc->tx_buf_list.spinlock); +- ++ ++ INIT_LIST_HEAD(&n_hdlc->rx_free_buf_list.list); ++ INIT_LIST_HEAD(&n_hdlc->tx_free_buf_list.list); ++ INIT_LIST_HEAD(&n_hdlc->rx_buf_list.list); ++ INIT_LIST_HEAD(&n_hdlc->tx_buf_list.list); ++ + /* allocate free rx buffer list */ + for(i=0;i<DEFAULT_RX_BUF_COUNT;i++) { + buf = kmalloc(N_HDLC_BUF_SIZE, GFP_KERNEL); +@@ -884,53 +878,65 @@ static struct n_hdlc *n_hdlc_alloc(void) + } /* end of n_hdlc_alloc() */ + + /** ++ * n_hdlc_buf_return - put the HDLC buffer after the head of the specified list ++ * @buf_list - pointer to the buffer list ++ * @buf - pointer to the buffer ++ */ ++static void n_hdlc_buf_return(struct n_hdlc_buf_list *buf_list, ++ struct n_hdlc_buf *buf) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&buf_list->spinlock, flags); ++ ++ list_add(&buf->list_item, &buf_list->list); ++ buf_list->count++; ++ ++ spin_unlock_irqrestore(&buf_list->spinlock, flags); ++} ++ ++/** + * n_hdlc_buf_put - add specified HDLC buffer to tail of specified list +- * @list - pointer to buffer list ++ * @buf_list - pointer to buffer list + * @buf - pointer to buffer + */ +-static void n_hdlc_buf_put(struct n_hdlc_buf_list *list, ++static void n_hdlc_buf_put(struct n_hdlc_buf_list *buf_list, + struct n_hdlc_buf *buf) + { + unsigned long flags; +- spin_lock_irqsave(&list->spinlock,flags); +- +- buf->link=NULL; +- if (list->tail) +- list->tail->link = buf; +- else +- list->head = buf; +- list->tail = buf; +- (list->count)++; +- +- spin_unlock_irqrestore(&list->spinlock,flags); +- ++ ++ spin_lock_irqsave(&buf_list->spinlock, flags); ++ ++ list_add_tail(&buf->list_item, &buf_list->list); ++ buf_list->count++; ++ ++ spin_unlock_irqrestore(&buf_list->spinlock, flags); + } /* end of n_hdlc_buf_put() */ + + /** + * n_hdlc_buf_get - remove and return an HDLC buffer from list +- * @list - pointer to HDLC buffer list ++ * @buf_list - pointer to HDLC buffer list + * + * Remove and return an HDLC buffer from the head of the specified HDLC buffer + * list. + * Returns a pointer to HDLC buffer if available, otherwise %NULL. + */ +-static struct n_hdlc_buf* n_hdlc_buf_get(struct n_hdlc_buf_list *list) ++static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_buf_list *buf_list) + { + unsigned long flags; + struct n_hdlc_buf *buf; +- spin_lock_irqsave(&list->spinlock,flags); +- +- buf = list->head; ++ ++ spin_lock_irqsave(&buf_list->spinlock, flags); ++ ++ buf = list_first_entry_or_null(&buf_list->list, ++ struct n_hdlc_buf, list_item); + if (buf) { +- list->head = buf->link; +- (list->count)--; ++ list_del(&buf->list_item); ++ buf_list->count--; + } +- if (!list->head) +- list->tail = NULL; +- +- spin_unlock_irqrestore(&list->spinlock,flags); ++ ++ spin_unlock_irqrestore(&buf_list->spinlock, flags); + return buf; +- + } /* end of n_hdlc_buf_get() */ + + static char hdlc_banner[] __initdata = ++++++ patches.kernel.org.tar.bz2 ++++++ ++++ 7633 lines of diff (skipped) ++++++ series.conf ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:57.323214074 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:57.323214074 +0100 @@ -28,6 +28,7 @@ # Send separate patches upstream if you find a problem... ######################################################## patches.kernel.org/patch-4.10.1 + patches.kernel.org/patch-4.10.1-2 ######################################################## # Build fixes that apply to the vanilla kernel too. @@ -374,6 +375,7 @@ # Char / serial ######################################################## patches.drivers/fbcon-Fix-vc-attr-at-deinit + patches.fixes/tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch ######################################################## # Other driver fixes ++++++ source-timestamp ++++++ --- /var/tmp/diff_new_pack.Us4qaD/_old 2017-03-15 01:59:57.355209551 +0100 +++ /var/tmp/diff_new_pack.Us4qaD/_new 2017-03-15 01:59:57.355209551 +0100 @@ -1,3 +1,3 @@ -2017-03-07 10:29:19 +0100 -GIT Revision: f764d4216e0a84a6577e402acf62abc0ca18f0dc +2017-03-12 20:54:41 +0100 +GIT Revision: bfb2d2236a4d00f925d24a4a4d1c200a43c2bc34 GIT Branch: stable