X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fmake_hash.c;h=c8bf911f826089da93f4da1e5e164fa6d0f1b439;hp=38980d2492edc8c5d0bac14f1455dcfabf79ab04;hb=bfe3845eb1a2ff02a740e917b537e939ec4e44cb;hpb=1c551ea75ea57f9186fbe8d79674ac85baa4d358 diff --git a/ncurses/tinfo/make_hash.c b/ncurses/tinfo/make_hash.c index 38980d24..c8bf911f 100644 --- a/ncurses/tinfo/make_hash.c +++ b/ncurses/tinfo/make_hash.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright (c) 1998-2017,2018 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 * @@ -34,7 +34,6 @@ /* * make_hash.c --- build-time program for constructing comp_captab.c - * */ #include @@ -44,7 +43,7 @@ #include -MODULE_ID("$Id: make_hash.c,v 1.10 2012/12/16 00:40:14 tom Exp $") +MODULE_ID("$Id: make_hash.c,v 1.17 2018/05/12 15:58:31 tom Exp $") /* * _nc_make_hash_table() @@ -59,6 +58,24 @@ MODULE_ID("$Id: make_hash.c,v 1.10 2012/12/16 00:40:14 tom Exp $") #define MODULE_ID(id) /*nothing */ #include +static void +failed(const char *s) +{ + perror(s); + exit(EXIT_FAILURE); +} + +static char * +strmalloc(char *s) +{ + size_t need = strlen(s) + 1; + char *result = malloc(need); + if (result == 0) + failed("strmalloc"); + _nc_STRCPY(result, s, need); + return result; +} + /* * int hash_function(string) * @@ -138,10 +155,12 @@ parse_columns(char *buffer) int col = 0; - if (list == 0 && (list = typeCalloc(char *, MAX_COLUMNS)) == 0) - return (0); - if (*buffer != '#') { + if (list == 0) { + list = typeCalloc(char *, (MAX_COLUMNS + 1)); + if (list == 0) + return (0); + } while (*buffer != '\0') { char *s; for (s = buffer; (*s != '\0') && !isspace(UChar(*s)); s++) @@ -207,13 +226,16 @@ main(int argc, char **argv) * Read the table into our arrays. */ for (n = 0; (n < CAPTABSIZE) && fgets(buffer, BUFSIZ, stdin);) { - char **list, *nlp = strchr(buffer, '\n'); + char **list; + char *nlp = strchr(buffer, '\n'); if (nlp) *nlp = '\0'; + else + buffer[sizeof(buffer) - 2] = '\0'; list = parse_columns(buffer); if (list == 0) /* blank or comment */ continue; - if (column > count_columns(list)) { + if (column < 0 || column > count_columns(list)) { fprintf(stderr, "expected %d columns, have %d:\n%s\n", column, count_columns(list), @@ -221,7 +243,7 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } name_table[n].nte_link = -1; /* end-of-hash */ - name_table[n].nte_name = strdup(list[column]); + name_table[n].nte_name = strmalloc(list[column]); if (!strcmp(list[2], "bool")) { name_table[n].nte_type = BOOLEAN; name_table[n].nte_index = BoolCount++; @@ -308,5 +330,11 @@ main(int argc, char **argv) printf("#endif\n\n"); free(hash_table); +#if NO_LEAKS + for (n = 0; (n < CAPTABSIZE); ++n) { + free((void *) name_table[n].nte_name); + } + free(name_table); +#endif return EXIT_SUCCESS; }