[OE-core] [PATCH] glibc_2.21.bb: Fix LSB bugs #3033

Li xin lixin.fnst at cn.fujitsu.com
Fri May 8 09:01:14 UTC 2015


Bug 3033 - T.c_iflag and T.tcgetattr fail when using pseudo ttys (on some systems).
https://lsbbugs.linuxfoundation.org/show_bug.cgi?id=3033

Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
---
 .../glibc/glibc/tcsetattr.c-Fix-LSB-NG-Cases.patch | 69 ++++++++++++++++++++++
 meta/recipes-core/glibc/glibc_2.21.bb              |  1 +
 2 files changed, 70 insertions(+)
 create mode 100644 meta/recipes-core/glibc/glibc/tcsetattr.c-Fix-LSB-NG-Cases.patch

diff --git a/meta/recipes-core/glibc/glibc/tcsetattr.c-Fix-LSB-NG-Cases.patch b/meta/recipes-core/glibc/glibc/tcsetattr.c-Fix-LSB-NG-Cases.patch
new file mode 100644
index 0000000..df0e61d
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/tcsetattr.c-Fix-LSB-NG-Cases.patch
@@ -0,0 +1,69 @@
+From 9022ee975265b65f59782ea92b59eccc95774a88 Mon Sep 17 00:00:00 2001
+From: Li xin <lixin.fnst at cn.fujitsu.com>
+Date: Fri, 8 May 2015 13:51:30 +0900
+Subject: [PATCH] tcsetattr.c: Fix LSB NG Cases
+
+/tset/POSIX.os/devclass/tcgetattr/T.tcgetattr 1 2
+/tset/POSIX.os/devclass/c_iflag/T.c_iflag 6 7 8 9
+
+This patch is from Fedora.
+
+Upstream-Status: pending.
+
+Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
+---
+ sysdeps/unix/sysv/linux/tcsetattr.c | 32 +++++++++++++++++++++++++++++++-
+ 1 file changed, 31 insertions(+), 1 deletion(-)
+
+diff --git a/sysdeps/unix/sysv/linux/tcsetattr.c b/sysdeps/unix/sysv/linux/tcsetattr.c
+index d7afc63..7cb2c61 100644
+--- a/sysdeps/unix/sysv/linux/tcsetattr.c
++++ b/sysdeps/unix/sysv/linux/tcsetattr.c
+@@ -48,6 +48,7 @@ tcsetattr (fd, optional_actions, termios_p)
+ {
+   struct __kernel_termios k_termios;
+   unsigned long int cmd;
++  int retval;
+ 
+   switch (optional_actions)
+     {
+@@ -79,6 +80,35 @@ tcsetattr (fd, optional_actions, termios_p)
+   memcpy (&k_termios.c_cc[0], &termios_p->c_cc[0],
+ 	  __KERNEL_NCCS * sizeof (cc_t));
+ 
+-  return INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios);
++  retval = INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios);
++
++  if (retval == 0 && cmd == TCSETS)
++    {
++      /* The Linux kernel has a bug which silently ignore the invalid
++        c_cflag on pty. We have to check it here. */
++      int save = errno;
++      retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios);
++      if (retval)
++       {
++         /* We cannot verify if the setting is ok. We don't return
++            an error (?). */
++         __set_errno (save);
++         retval = 0;
++       }
++      else if ((termios_p->c_cflag & (PARENB | CREAD))
++              != (k_termios.c_cflag & (PARENB | CREAD))
++              || ((termios_p->c_cflag & CSIZE)
++                  && ((termios_p->c_cflag & CSIZE)
++                      != (k_termios.c_cflag & CSIZE))))
++       {
++         /* It looks like the Linux kernel silently changed the
++            PARENB/CREAD/CSIZE bits in c_cflag. Report it as an
++            error. */
++         __set_errno (EINVAL);
++         retval = -1;
++       }
++    }
++
++  return retval;
+ }
+ libc_hidden_def (tcsetattr)
+-- 
+1.8.4.2
+
diff --git a/meta/recipes-core/glibc/glibc_2.21.bb b/meta/recipes-core/glibc/glibc_2.21.bb
index 58a9601..a061b08 100644
--- a/meta/recipes-core/glibc/glibc_2.21.bb
+++ b/meta/recipes-core/glibc/glibc_2.21.bb
@@ -27,6 +27,7 @@ SRC_URI = "git://sourceware.org/git/glibc.git;branch=${BRANCH} \
            file://0001-yes-within-the-path-sets-wrong-config-variables.patch \
            file://elf-Makefile-fix-a-typo.patch \
            ${EGLIBCPATCHES} \
+           file://tcsetattr.c-Fix-LSB-NG-Cases.patch \
           "
 EGLIBCPATCHES = "\
            file://timezone-re-written-tzselect-as-posix-sh.patch \
-- 
1.8.4.2




More information about the Openembedded-core mailing list