Control: tags -1 + patch

On 2018-02-18 18:07 +0100, Sven Joachim wrote:

> Package: libslang2
> Version: 2.3.1a-2
> Severity: important
>
> In ncurses 6.1, an extended terminfo format has been introduced with
> 32-bit database entries.  It is automatically enabled if the tinfo
> library is configured with --with-abi-version=6 and --enable-widec.
> The Debian package currently does neither (see #230990 on the former),
> but I would like to enable this new format soon.
>
> The slang library, as of version 2.3.1a, is not compatible with these
> new database entries, which causes applications to misbehave or even
> fail to start.  This has been noticed in other distributions which have
> enabled the new terminfo format:
>
> https://bugs.archlinux.org/task/57300
> https://bugzilla.opensuse.org/show_bug.cgi?id=1079543
> [...]
> It looks like upstream has addressed this problem in version pre2.3.2-19
> ("Added support for the new ncurses 32-bit terminfo database entries."),
> I will look if I can extract a patch from their git repository.

That turned out to to be pleasantly easy.  I only had to remove the
irrelevant hunks for changes.txt and src/slang.h to get the patch
applied, and from a quick test with Midnight Commander and whiptail it
seems to work just fine. :-)

Attached is the patch, ready to be dropped into debian/patches.  Don't
forget to update the series file to actually apply it.

Cheers,
       Sven

From 6dd5ade9a97b52ace4ac033779a6d3c1c51db4d1 Mon Sep 17 00:00:00 2001
From: "John E. Davis" <j...@jedsoft.org>
Date: Tue, 30 Jan 2018 04:04:17 -0500
Subject: [PATCH 1/1] pre2.3.2-19: Added support for the new ncurses 32-bit
 terminfo database entries.

---
 src/sltermin.c |   76 +++++++++++++++++++++++++++++++++++++++++++--------------
 src/untic.c    |    5 ++-
 2 files changed, 61 insertions(+), 20 deletions(-)

--- a/src/sltermin.c
+++ b/src/sltermin.c
@@ -33,6 +33,11 @@ USA.
  * term(4) man page on an SGI.
  */
 
+/* The ncurses terminfo binary files come in two flavors: A legacy
+ * format that uses 16 bit integers in the number-section, and a new
+ * 32 bit format (nurses 6, from 2018).
+ */
+
 /* Short integers are stored in two 8-bit bytes.  The first byte contains
  * the least significant 8 bits of the value, and the second byte contains
  * the most significant 8 bits.  (Thus, the value represented is
@@ -43,7 +48,7 @@ USA.
  * source and also is to be considered missing.
  */
 
-static int make_integer (unsigned char *buf)
+static int make_integer16 (unsigned char *buf)
 {
    register int lo, hi;
    lo = (int) *buf++; hi = (int) *buf;
@@ -55,6 +60,20 @@ static int make_integer (unsigned char *
    return lo + 256 * hi;
 }
 
+static int make_integer32 (unsigned char *buf)
+{
+   unsigned int u;
+   int i;
+
+   u = (unsigned int)buf[0];
+   u |= ((unsigned int)buf[1])<<8;
+   u |= ((unsigned int)buf[2])<<16;
+   u |= ((unsigned int)buf[3])<<24;
+
+   i = (int)u;
+   return i;
+}
+
 /*
  * The compiled file is created from the source file descriptions of the
  * terminals (see the -I option of infocmp) by using the terminfo compiler,
@@ -64,14 +83,15 @@ static int make_integer (unsigned char *
  *
  * The header section begins the file.  This section contains six short
  * integers in the format described below.  These integers are (1) the magic
- * number (octal 0432); (2) the size, in bytes, of the names section; (3)
- * the number of bytes in the boolean section; (4) the number of short
- * integers in the numbers section; (5) the number of offsets (short
+ * number (legacy:0432, 01036:32 but); (2) the size, in bytes, of the names section; (3)
+ * the number of bytes in the boolean section; (4) the number of integers
+ * in the numbers section; (5) the number of offsets (short
  * integers) in the strings section; (6) the size, in bytes, of the string
  * table.
  */
 
-#define MAGIC 0432
+#define MAGIC_LEGACY 0432
+#define MAGIC_32BIT 01036
 
 /* In this structure, all char * fields are malloced EXCEPT if the
  * structure is SLTERMCAP.  In that case, only terminal_names is malloced
@@ -91,6 +111,8 @@ struct _pSLterminfo_Type
 
    unsigned int num_numbers;
    unsigned char *numbers;
+   unsigned int sizeof_number;
+   int (*make_integer)(unsigned char *);
 
    unsigned int num_string_offsets;
    unsigned char *string_offsets;
@@ -109,6 +131,7 @@ static FILE *open_terminfo (char *file,
 {
    FILE *fp;
    unsigned char buf[12];
+   int magic;
 
    /* Alan Cox reported a security problem here if the application using the
     * library is setuid.  So, I need to make sure open the file as a normal
@@ -122,19 +145,34 @@ static FILE *open_terminfo (char *file,
    fp = fopen (file, "rb");
    if (fp == NULL) return NULL;
 
-   if ((12 == fread ((char *) buf, 1, 12, fp) && (MAGIC == make_integer (buf))))
+   if (12 != fread ((char *)buf, 1, 12, fp))
+     {
+	(void) fclose(fp);
+	return NULL;
+     }
+   magic = make_integer16(buf);
+   if (magic == MAGIC_LEGACY)
+     {
+	h->make_integer = make_integer16;
+	h->sizeof_number = 2;
+     }
+   else if (magic == MAGIC_32BIT)
      {
-	h->name_section_size = make_integer (buf + 2);
-	h->boolean_section_size = make_integer (buf + 4);
-	h->num_numbers = make_integer (buf + 6);
-	h->num_string_offsets = make_integer (buf + 8);
-	h->string_table_size = make_integer (buf + 10);
+	h->make_integer = make_integer32;
+	h->sizeof_number = 4;
      }
    else
      {
-	fclose (fp);
-	fp = NULL;
+	(void) fclose (fp);
+	return NULL;
      }
+
+   h->name_section_size = make_integer16 (buf + 2);
+   h->boolean_section_size = make_integer16 (buf + 4);
+   h->num_numbers = make_integer16 (buf + 6);
+   h->num_string_offsets = make_integer16 (buf + 8);
+   h->string_table_size = make_integer16 (buf + 10);
+
    return fp;
 }
 
@@ -187,13 +225,14 @@ static unsigned char *read_boolean_flags
 
 /*
  * The numbers section is similar to the boolean flags section.  Each
- * capability takes up two bytes, and is stored as a short integer.  If the
- * value represented is -1 or -2, the capability is taken to be missing.
+ * capability takes up 2(4) bytes for the legacy(32 bit) format and
+ * is stored as a integer.  If the value represented is -1 or -2, the
+ * capability is taken to be missing.
  */
 
 static unsigned char *read_numbers (FILE *fp, SLterminfo_Type *t)
 {
-   return t->numbers = read_terminfo_section (fp, 2 * t->num_numbers);
+   return t->numbers = read_terminfo_section (fp, t->sizeof_number * t->num_numbers);
 }
 
 /* The strings section is also similar.  Each capability is stored as a
@@ -402,7 +441,7 @@ char *_pSLtt_tigetstr (SLterminfo_Type *
 
    offset = compute_cap_offset (cap, t, Tgetstr_Map, t->num_string_offsets);
    if (offset < 0) return NULL;
-   offset = make_integer (t->string_offsets + 2 * offset);
+   offset = make_integer16 (t->string_offsets + 2 * offset);
    if (offset < 0) return NULL;
    return t->string_table + offset;
 }
@@ -418,7 +457,8 @@ int _pSLtt_tigetnum (SLterminfo_Type *t,
 
    offset = compute_cap_offset (cap, t, Tgetnum_Map, t->num_numbers);
    if (offset < 0) return -1;
-   return make_integer (t->numbers + 2 * offset);
+
+   return (*t->make_integer)(t->numbers + t->sizeof_number * offset);
 }
 
 int _pSLtt_tigetflag (SLterminfo_Type *t, SLCONST char *cap)
--- a/src/untic.c
+++ b/src/untic.c
@@ -36,7 +36,7 @@ int main (int argc, char **argv)
    puts (t->terminal_names);
    while (*map->name != 0)
      {
-	str = (unsigned char *) SLtt_tigetstr (map->name, (char **) &t);
+	str = (unsigned char *) SLtt_tigetstr ((SLFUTURE_CONST char *)map->name, (char **) &t);
 	if (str == NULL)
 	  {
 	     map++;
@@ -76,7 +76,7 @@ int main (int argc, char **argv)
    while (*map->name != 0)
      {
 	int val;
-	if ((val = SLtt_tigetnum (map->name, (char **) &t)) >= 0)
+	if ((val = SLtt_tigetnum ((SLFUTURE_CONST char *)map->name, (char **) &t)) >= 0)
 	  {
 	     fprintf (stdout, "\t%s#%d\t\t%s\n",
 		      map->name, val,
@@ -85,6 +85,7 @@ int main (int argc, char **argv)
 	map++;
      }
 
+   _pSLtt_tifreeent (t);
    return 0;
 }
 

Attachment: signature.asc
Description: PGP signature

Reply via email to