fix unveil(2) permissions and path name + misc code fixes - bmf - bmf (Bayesian Mail Filter) 0.9.4 fork + patches
 (HTM) git clone git://git.codemadness.org/bmf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit da144ef21a75e5a1f78c1faf2d76d93c68f6180f
 (DIR) parent 8c0e2cad22ac8e72666e90b8069cb0b082e38429
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 27 Oct 2018 19:56:26 +0200
       
       fix unveil(2) permissions and path name + misc code fixes
       
       - check strdup call
       - remove dbh_t abstraction
       - remove unneccesary casts.
       
       Diffstat:
         M bmf.c                               |      12 ++++++++----
         M dbg.c                               |       3 ++-
         M dbh.c                               |      22 ++++++++++------------
         M dbh.h                               |       9 +--------
         M lex.c                               |       5 ++---
         M vec.c                               |       3 ++-
       
       6 files changed, 25 insertions(+), 29 deletions(-)
       ---
 (DIR) diff --git a/bmf.c b/bmf.c
       @@ -75,12 +75,12 @@ version(void)
        int
        main(int argc, char **argv)
        {
       -        char *dbname = NULL;
       +        char *dbname = "";
                bool_t rdonly;
                runmode_t mode = mode_normal;
                mbox_t mboxtype = detect;
                bool_t do_passthru = false;
       -        dbh_t *pdb;
       +        dbhtext_t *pdb;
                dbt_t *pblist, *pglist, *ptable;
                vec_t mlist;
                stats_t stats;
       @@ -110,7 +110,10 @@ main(int argc, char **argv)
                                break;        /* NOTREACHED */
                        case 'd':
                                free(dbname);
       -                        dbname = strdup(optarg);
       +                        if (!(dbname = strdup(optarg))) {
       +                                perror("strdup()");
       +                                exit(2);
       +                        }
                                break;
                        case 'h':
                                usage();
       @@ -151,7 +154,8 @@ main(int argc, char **argv)
                }
                stats.extrema = (discrim_t *) malloc(stats.keepers * sizeof(discrim_t));
        
       -        pdb = dbtext_db_open(dbname);
       +        /* create directory if it doesn't exist yet, when dbname is NULL or empty use $HOME/.bmf */
       +        pdb = dbtext_db_open(dbname, rdonly);
                if (pdb == NULL) {
                        fprintf(stderr, "%s: cannot open database\n", argv[0]);
                        exit(2);
 (DIR) diff --git a/dbg.c b/dbg.c
       @@ -9,9 +9,10 @@
         * dbg.c: debug functions for bmf.
         */
        
       +#include <stdarg.h>
       +
        #include "config.h"
        #include "dbg.h"
       -#include <stdarg.h>
        
        uint g_verbose = 0;
        
 (DIR) diff --git a/dbh.c b/dbh.c
       @@ -48,8 +48,8 @@ db_getnewcount(veciter_t * piter)
                return count;
        }
        
       -dbh_t *
       -dbtext_db_open(cpchar dbname)
       +dbhtext_t *
       +dbtext_db_open(cpchar dbname, bool_t rdonly)
        {
                dbhtext_t *pthis = NULL;
                uint dirlen;
       @@ -64,7 +64,7 @@ dbtext_db_open(cpchar dbname)
                pthis->close = dbtext_db_close;
                pthis->opentable = dbtext_db_opentable;
        
       -        if (dbname != NULL && *dbname != '\0') {
       +        if (dbname[0]) {
                        dirlen = strlen(dbname);
                        if ((pthis->dir = strdup(dbname)) == NULL) {
                                perror("strdup()");
       @@ -77,7 +77,7 @@ dbtext_db_open(cpchar dbname)
                        if (phome == NULL || *phome == '\0') {
                                phome = ".";
                        }
       -                dirlen = strlen(phome) + 5 + 1;
       +                dirlen = strlen(phome) + sizeof("/.bmf");
                        if ((pthis->dir = malloc(dirlen)) == NULL)
                                goto bail;
        
       @@ -96,15 +96,14 @@ dbtext_db_open(cpchar dbname)
                }
        
                /* unveil(2), TODO: rework later */
       -        /* TODO: permission depending on mode */
                char listpath[PATH_MAX];
       -        snprintf(listpath, sizeof(listpath), "%s/%s", pthis->dir, "goodlist");
       -        if (unveil(listpath, "rw") == -1) {
       +        snprintf(listpath, sizeof(listpath), "%s/%s", pthis->dir, "goodlist.txt");
       +        if (unveil(listpath, rdonly ? "rc" : "rwc") == -1) {
                        perror("unveil()");
                        exit(2);
                }
       -        snprintf(listpath, sizeof(listpath), "%s/%s", pthis->dir, "spamlist");
       -        if (unveil(listpath, "rw") == -1) {
       +        snprintf(listpath, sizeof(listpath), "%s/%s", pthis->dir, "spamlist.txt");
       +        if (unveil(listpath, rdonly ? "rc" : "rwc") == -1) {
                        perror("unveil()");
                        exit(2);
                }
       @@ -113,7 +112,7 @@ dbtext_db_open(cpchar dbname)
                        exit(2);
                }
        
       -        return (dbh_t *)pthis;
       +        return pthis;
        
        bail:
                if (pthis) {
       @@ -222,8 +221,7 @@ dbtext_db_opentable(dbhtext_t * pthis, cpchar table, bool_t rdonly)
                if (st.st_size == 0) {
                        return (dbt_t *) ptable;
                }
       -        ptable->pbuf = (char *) malloc(st.st_size);
       -        if (ptable->pbuf == NULL) {
       +        if ((ptable->pbuf = malloc(st.st_size)) == NULL) {
                        perror("malloc()");
                        goto bail_uc;
                }
 (DIR) diff --git a/dbh.h b/dbh.h
       @@ -29,13 +29,6 @@ struct _dbt {
                uint(*getcount) (dbt_t *, str_t *);
        };
        
       -/* database instance */
       -typedef struct _dbh dbh_t;
       -struct _dbh {
       -        bool_t(*close) (dbh_t *);
       -        dbt_t *(*opentable) (dbh_t *, cpchar, bool_t);
       -};
       -
        typedef struct _dbttext dbttext_t;
        struct _dbttext
        {
       @@ -64,7 +57,7 @@ struct _dbhtext
        
        uint db_getnewcount(veciter_t * piter);
        
       -dbh_t*  dbtext_db_open(cpchar dbname);
       +dbhtext_t*  dbtext_db_open(cpchar dbname, bool_t rdonly);
        bool_t  dbtext_db_close( dbhtext_t* pthis );
        dbt_t*  dbtext_db_opentable( dbhtext_t* pthis, cpchar table, bool_t rdonly );
        
 (DIR) diff --git a/lex.c b/lex.c
       @@ -482,10 +482,9 @@ lex_load(lex_t * pthis, int fd)
                ssize_t nread;
        
                nalloc = IOBUFSIZE;
       -        pthis->pbuf = (char *) malloc(IOBUFSIZE);
       -        if (pthis->pbuf == NULL) {
       +        if ((pthis->pbuf = malloc(IOBUFSIZE)) == NULL)
                        return false;
       -        }
       +
                while ((nread = read(fd, pthis->pbuf + pthis->buflen, nalloc - pthis->buflen)) > 0) {
                        pthis->buflen += nread;
                        if (pthis->buflen == nalloc) {
 (DIR) diff --git a/vec.c b/vec.c
       @@ -28,7 +28,8 @@ vec_create(vec_t * pthis)
        {
                pthis->nalloc = VEC_INITIAL_SIZE;
                pthis->nitems = 0;
       -        pthis->pitems = (str_t *) malloc(VEC_INITIAL_SIZE * sizeof(str_t));
       +        /* TODO: check malloc() */
       +        pthis->pitems = malloc(VEC_INITIAL_SIZE * sizeof(str_t));
        }
        
        void