dtprintinfo: Fix SIGSEGV in dtprintinfo (passing NULL as first argument to catgets).
authorJon Trulson <jon@radscan.com>
Mon, 6 Aug 2012 23:12:38 +0000 (17:12 -0600)
committerJon Trulson <jon@radscan.com>
Mon, 6 Aug 2012 23:12:38 +0000 (17:12 -0600)
Patch from Douglas Mencken <dougmencken@gmail.com>:

The issue is that MESSAGE tries to invoke catgets with NULL first
parameter, which is dereferenced inside catgets (Std C Library
function) without checking, from catgets.c source:

if (catalog->name_ptr[idx + 0] == (u_int32_t) set
          && catalog->name_ptr[idx + 1] == (u_int32_t) message)

On the other hand, there's a special value: -1 (cast to nl_catd),
which must be used instead of 0 (NULL) in the case when we are unable
to provide real catalog_desc, from catgets.c source:

  /* Be generous if catalog which failed to be open is used.  */
  if (catalog_desc == (nl_catd) -1 || ++set <= 0 || message < 0)
    return (char *) string;

cde/programs/dtprintinfo/DtPrintinfo.C

index 065c8af8fa312acd266485506018731bc0bbfabf..ac780a08d5f146cf2c6ebfa6ec8c4f3f537d3eb0 100644 (file)
@@ -94,14 +94,18 @@ int main(int argc, char **argv)
       dtprintinfo_cat = catopen("dtprintinfo", 0);
 #endif
 
-      if ((nl_catd) errno || dtprintinfo_cat == (nl_catd) -1)
-         dtprintinfo_cat = NULL;
+      if ((nl_catd) errno)
+         dtprintinfo_cat = (nl_catd) -1;
 #ifdef hpux
       else
          msg_strings = (char **)calloc(LAST_MSG_NO, sizeof(char *));
 #endif
     }
 
+   if (dtprintinfo_cat == NULL) {
+      dtprintinfo_cat = (nl_catd) -1;
+   }
+
    if (!STRCMP(argv[1], "-help"))
     {
       char *output;