Hi!

I noticed that dict_cdb uses static buffer to read the value,
while all other maps use per-instance val_buf vstring or similar,
and even the fold_buf is per-instance.  I wonder if something like
the below is actually necessary.

diff --git a/src/util/dict_cdb.c b/src/util/dict_cdb.c
index a9133cc3..63f5eaeb 100644
--- a/src/util/dict_cdb.c
+++ b/src/util/dict_cdb.c
@@ -84,6 +84,7 @@
 typedef struct {
     DICT    dict;                      /* generic members */
     struct cdb cdb;                    /* cdb structure */
+    VSTRING *val_buf;                  /* value result */
 } DICT_CDBQ;                           /* query interface */

 typedef struct {
@@ -100,8 +101,6 @@ static const char *dict_cdbq_lookup(DICT *dict, const char 
*name)
     DICT_CDBQ *dict_cdbq = (DICT_CDBQ *) dict;
     unsigned vlen;
     int     status = 0;
-    static char *buf;
-    static unsigned len;
     const char *result = 0;

     dict->error = 0;
@@ -142,19 +141,21 @@ static const char *dict_cdbq_lookup(DICT *dict, const 
char *name)

     if (status) {
        vlen = cdb_datalen(&dict_cdbq->cdb);
-       if (len < vlen) {
-           if (buf == 0)
-               buf = mymalloc(vlen + 1);
-           else
-               buf = myrealloc(buf, vlen + 1);
-           len = vlen;
+       if (!dict_cdbq->val_buf)
+           dict_cdbq->val_buf = vstring_alloc(vlen < 20 ? 20 : vlen);
+       else {
+           VSTRING_RESET(dict_cdbq->val_buf);
+           VSTRING_SPACE(dict_cdbq->val_buf, vlen);
        }
-       if (cdb_read(&dict_cdbq->cdb, buf, vlen,
-                    cdb_datapos(&dict_cdbq->cdb)) < 0)
+       if (cdb_read(&dict_cdbq->cdb, vstring_str(dict_cdbq->val_buf),
+                    vlen, cdb_datapos(&dict_cdbq->cdb)) < 0)
            msg_fatal("error reading %s: %m", dict->name);
-       buf[vlen] = '\0';
-       result = buf;
+       vstring_set_payload_size(dict_cdbq->val_buf, vlen);
+       VSTRING_TERMINATE(dict_cdbq->val_buf);
+
+       result = vstring_str(dict_cdbq->val_buf);
     }
+
     /* No locking so not release the lock.  */

     return (result);
@@ -170,6 +171,8 @@ static void dict_cdbq_close(DICT *dict)
     close(dict->stat_fd);
     if (dict->fold_buf)
        vstring_free(dict->fold_buf);
+    if (dict_cdbq->val_buf)
+       vstring_free(dict_cdbq->val_buf);
     dict_free(dict);
 }

@@ -206,6 +209,7 @@ static DICT *dict_cdbq_open(const char *path, int 
dict_flags)
 #else
     cdb_init(&(dict_cdbq->cdb), fd);
 #endif
+    dict_cdbq->val_buf = 0;
     dict_cdbq->dict.lookup = dict_cdbq_lookup;
     dict_cdbq->dict.close = dict_cdbq_close;
     dict_cdbq->dict.stat_fd = fd;

_______________________________________________
Postfix-devel mailing list -- postfix-devel@postfix.org
To unsubscribe send an email to postfix-devel-le...@postfix.org

Reply via email to