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


Reply via email to