X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fwrite_entry.c;h=a5f8604ec88a7fac47c49e5fdfe714e65948954a;hp=9fdfe59d97113c955b65478a772a9e725f15822f;hb=c72b2c2c48ade76b5b4090b0f54b619a4fd483d9;hpb=b6d0d9ad9e372e856f01a4c283cf784a15993903 diff --git a/ncurses/tinfo/write_entry.c b/ncurses/tinfo/write_entry.c index 9fdfe59d..a5f8604e 100644 --- a/ncurses/tinfo/write_entry.c +++ b/ncurses/tinfo/write_entry.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright (c) 1998-2014,2015 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 * @@ -47,12 +47,11 @@ #define TRACE_OUT(p) /*nothing */ #endif -MODULE_ID("$Id: write_entry.c,v 1.86 2012/06/16 16:59:05 tom Exp $") +MODULE_ID("$Id: write_entry.c,v 1.93 2015/09/05 21:24:29 tom Exp $") static int total_written; static int make_db_root(const char *); -static int write_object(TERMTYPE *, char *, unsigned *, unsigned); #if !USE_HASHED_DB static void @@ -69,7 +68,7 @@ write_file(char *filename, TERMTYPE *tp) } DEBUG(1, ("Created %s", filename)); - if (write_object(tp, buffer, &offset, limit) == ERR + if (_nc_write_object(tp, buffer, &offset, limit) == ERR || fwrite(buffer, sizeof(char), (size_t) offset, fp) != offset) { _nc_syserr_abort("error writing %s/%s", _nc_tic_dir(0), filename); } @@ -93,7 +92,7 @@ check_writeable(int code) char dir[sizeof(LEAF_FMT)]; char *s = 0; - if (code == 0 || (s = strchr(dirnames, code)) == 0) + if (code == 0 || (s = (strchr) (dirnames, code)) == 0) _nc_err_abort("Illegal terminfo subdirectory \"" LEAF_FMT "\"", code); if (verified[s - dirnames]) @@ -185,13 +184,16 @@ make_db_root(const char *path) * Set the write directory for compiled entries. */ NCURSES_EXPORT(void) -_nc_set_writedir(char *dir) +_nc_set_writedir(const char *dir) { const char *destination; char actual[PATH_MAX]; if (dir == 0 - && use_terminfo_vars()) +#ifndef USE_ROOT_ENVIRON + && use_terminfo_vars() +#endif + ) dir = getenv("TERMINFO"); if (dir != 0) @@ -273,16 +275,21 @@ _nc_write_entry(TERMTYPE *const tp) char name_list[MAX_TERMINFO_LENGTH]; char *first_name, *other_names; char *ptr; + char *term_names = tp->term_names; + size_t name_size = strlen(term_names); - assert(strlen(tp->term_names) != 0); - assert(strlen(tp->term_names) < sizeof(name_list)); + if (name_size == 0) { + _nc_syserr_abort("no terminal name found."); + } else if (name_size >= sizeof(name_list) - 1) { + _nc_syserr_abort("terminal name too long: %s", term_names); + } - _nc_STRCPY(name_list, tp->term_names, sizeof(name_list)); + _nc_STRCPY(name_list, term_names, sizeof(name_list)); DEBUG(7, ("Name list = '%s'", name_list)); first_name = name_list; - ptr = &name_list[strlen(name_list) - 1]; + ptr = &name_list[name_size - 1]; other_names = ptr + 1; while (ptr > name_list && *ptr != '|') @@ -308,7 +315,7 @@ _nc_write_entry(TERMTYPE *const tp) _nc_set_type(first_name); #if USE_HASHED_DB - if (write_object(tp, buffer + 1, &offset, limit - 1) != ERR) { + if (_nc_write_object(tp, buffer + 1, &offset, limit - 1) != ERR) { DB *capdb = _nc_db_open(_nc_tic_dir(0), TRUE); DBT key, data; @@ -316,8 +323,8 @@ _nc_write_entry(TERMTYPE *const tp) buffer[0] = 0; memset(&key, 0, sizeof(key)); - key.data = tp->term_names; - key.size = strlen(tp->term_names); + key.data = term_names; + key.size = name_size; memset(&data, 0, sizeof(data)); data.data = buffer; @@ -331,9 +338,9 @@ _nc_write_entry(TERMTYPE *const tp) key.size = strlen(name_list); _nc_STRCPY(buffer + 1, - tp->term_names, + term_names, sizeof(buffer) - 1); - data.size = strlen(tp->term_names) + 1; + data.size = name_size + 1; _nc_db_put(capdb, &key, &data); @@ -612,8 +619,8 @@ extended_object(TERMTYPE *tp) } #endif -static int -write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) +NCURSES_EXPORT(int) +_nc_write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) { char *namelist; size_t namelen, boolmax, nummax, strmax;