summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2022-02-27 16:33:24 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2022-02-27 16:49:03 +0000
commit7d238090f5fbd23d7077eba95c1ba8f2ee016a00 (patch)
treec41deb95a4561b3022c9a0a5bbea8b61dd4b461a /src
parent45329490797bbaf91000dfa992a97a811f306b70 (diff)
NDBM: check for bogus name given to create call
Diffstat (limited to 'src')
-rw-r--r--src/src/dbstuff.h15
-rw-r--r--src/src/transports/autoreply.c27
2 files changed, 17 insertions, 25 deletions
diff --git a/src/src/dbstuff.h b/src/src/dbstuff.h
index a5905231e..296a8e18c 100644
--- a/src/src/dbstuff.h
+++ b/src/src/dbstuff.h
@@ -434,8 +434,19 @@ interface */
/* Access functions */
/* EXIM_DBOPEN - returns a EXIM_DB *, NULL if failed */
-# define EXIM_DBOPEN__(name, dirname, flags, mode, dbpp) \
- *(dbpp) = dbm_open(CS name, flags, mode)
+/* Check that the name given is not present. This catches
+a directory name; otherwise we would create the name.pag and
+name.dir files in the directory's parent. */
+
+# define EXIM_DBOPEN__(name, dirname, flags, mode, dbpp) \
+ { \
+ struct stat st; \
+ *(dbpp) = !(flags & O_CREAT) \
+ || lstat(CCS (name), &st) != 0 && errno == ENOENT \
+ ? dbm_open(CS (name), (flags), (mode)) \
+ : (errno = (st.st_mode & S_IFMT) == S_IFDIR ? EISDIR : EEXIST, \
+ NULL); \
+ }
/* EXIM_DBGET - returns TRUE if successful, FALSE otherwise */
# define EXIM_DBGET(db, key, data) \
diff --git a/src/src/transports/autoreply.c b/src/src/transports/autoreply.c
index 6110f87bf..f630c6eb3 100644
--- a/src/src/transports/autoreply.c
+++ b/src/src/transports/autoreply.c
@@ -57,27 +57,11 @@ BOOL autoreply_transport_entry(transport_instance *tblock, address_item *addr) {
#else /*!MACRO_PREDEF*/
-/* Default private options block for the autoreply transport. */
+/* Default private options block for the autoreply transport.
+All non-mentioned lements zero/null/false. */
autoreply_transport_options_block autoreply_transport_option_defaults = {
- NULL, /* from */
- NULL, /* reply_to */
- NULL, /* to */
- NULL, /* cc */
- NULL, /* bcc */
- NULL, /* subject */
- NULL, /* headers */
- NULL, /* text */
- NULL, /* file */
- NULL, /* logfile */
- NULL, /* oncelog */
- NULL, /* once_repeat */
- NULL, /* never_mail */
- 0600, /* mode */
- 0, /* once_file_size */
- FALSE, /* file_expand */
- FALSE, /* file_optional */
- FALSE /* return message */
+ .mode = 0600,
};
@@ -362,16 +346,13 @@ else
return FALSE;
if (oncerepeat)
- {
- once_repeat_sec = readconf_readtime(oncerepeat, 0, FALSE);
- if (once_repeat_sec < 0)
+ if ((once_repeat_sec = readconf_readtime(oncerepeat, 0, FALSE)) < 0)
{
addr->transport_return = FAIL;
addr->message = string_sprintf("Invalid time value \"%s\" for "
"\"once_repeat\" in %s transport", oncerepeat, tblock->name);
return FALSE;
}
- }
}
/* If the never_mail option is set, we have to scan all the recipients and