ncurses 5.7 - patch 20091219
[ncurses.git] / ncurses / tinfo / read_entry.c
index 532e5a35ac94d9a891a0c633a619ee72bd800f75..b34ed8ddc12822eb9adb09eb03d7a7da89a7343e 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -42,7 +42,7 @@
 #include <tic.h>
 #include <term_entry.h>
 
-MODULE_ID("$Id: read_entry.c,v 1.101 2008/07/12 20:23:13 tom Exp $")
+MODULE_ID("$Id: read_entry.c,v 1.105 2009/12/06 01:22:26 tom Exp $")
 
 #define TYPE_CALLOC(type,elts) typeCalloc(type, (unsigned)(elts))
 
@@ -313,6 +313,8 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
        }
 
        if (need) {
+           if (ext_str_count >= (MAX_ENTRY_SIZE * 2))
+               return (TGETENT_NO);
            if ((ptr->ext_Names = TYPE_CALLOC(char *, need)) == 0)
                  return (TGETENT_NO);
            TR(TRACE_DATABASE,
@@ -402,26 +404,22 @@ _nc_read_tic_entry(char *filename,
     /*
      * If we are looking in a directory, assume the entry is a file under that,
      * according to the normal rules.
-     *
-     * FIXME - add caseless-filename fixup.
      */
-    if (_nc_is_dir_path(path)) {
-       unsigned need = 4 + strlen(path) + strlen(name);
+    unsigned need = LEAF_LEN + 3 + strlen(path) + strlen(name);
+    if (need <= limit)
+       (void) sprintf(filename, "%s/" LEAF_FMT "/%s", path, *name, name);
 
-       if (need <= limit) {
-           (void) sprintf(filename, "%s/" LEAF_FMT "/%s", path, *name, name);
-           result = _nc_read_file_entry(filename, tp);
-       }
-    }
+    if (_nc_is_dir_path(path))
+       result = _nc_read_file_entry(filename, tp);
 #if USE_HASHED_DB
     else {
        static const char suffix[] = DBM_SUFFIX;
        DB *capdbp;
        unsigned lens = sizeof(suffix) - 1;
        unsigned size = strlen(path);
-       unsigned need = lens + size;
+       unsigned test = lens + size;
 
-       if (need <= limit) {
+       if (test < limit) {
            if (size >= lens
                && !strcmp(path + size - lens, suffix))
                (void) strcpy(filename, path);
@@ -513,6 +511,7 @@ _nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp)
 {
     int code = TGETENT_NO;
 
+    sprintf(filename, "%.*s", PATH_MAX - 1, name);
     if (strlen(name) == 0
        || strcmp(name, ".") == 0
        || strcmp(name, "..") == 0