diff options
Diffstat (limited to 'net-mail/vpopmail/files')
7 files changed, 480 insertions, 0 deletions
diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-clean-up-calling-maildrop.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-clean-up-calling-maildrop.patch new file mode 100644 index 000000000000..c85c1b3150d2 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-clean-up-calling-maildrop.patch @@ -0,0 +1,74 @@ +From 692e6f75056d93f0e9a024e3638259d5ba0fe398 Mon Sep 17 00:00:00 2001 +From: Rolf Eike Beer <eike@sf-mail.de> +Date: Thu, 21 Aug 2014 17:55:27 +0200 +Subject: [PATCH 4/5] clean up calling maildrop + +-add const for arguments +-do not prepend "| " to call for preline, run_command() will then just skip + over this anyway +-put the buffer for the maildrop command in the most local scope +--- + vdelivermail.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +diff --git a/vpopmail-5.4.33/vdelivermail.c b/vpopmail-5.4.33/vdelivermail.c +index be83a2a..2ad2e12 100644 +--- a/vdelivermail.c ++++ b/vdelivermail.c +@@ -94,7 +94,7 @@ ssize_t get_message_size(); + void deliver_mail(char *address, char *quota); + int check_forward_deliver(char *dir); + int is_looping( char *address ); +-void run_command(char *prog); ++static void run_command(const char *prog); + void checkuser(void); + void usernotfound(void); + int is_loop_match( const char *dt, const char *address); +@@ -360,9 +360,6 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t + long unsigned pid; + int pim[2]; + #endif +-#ifdef MAILDROP +- char maildrop_command[256]; +-#endif + + /* write the Return-Path: and Delivered-To: headers */ + if (headerlen > 0) { +@@ -409,7 +406,8 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t + #ifdef MAILDROP + if ( limits.disable_maildrop==0 && vpw!=NULL && + !(vpw->pw_gid & NO_MAILDROP) ) { +- sprintf(maildrop_command, "| preline %s", MAILDROP_PROG); ++ char maildrop_command[256]; ++ sprintf(maildrop_command, "preline %s", MAILDROP_PROG); + run_command(maildrop_command); + DeleteMail = 1; + return(0); +@@ -896,13 +894,13 @@ void (*f)(); + /* open a pipe to a command + * return the pid or -1 if error + */ +-void run_command(char *prog) ++void run_command(const char *prog) + { + + #define MAX_ENV_BUFF 100 + + int child; +- char *(args[4]); ++ const char *(args[4]); + int wstat; + + while ((*prog == ' ') || (*prog == '|')) ++prog; +@@ -915,7 +913,7 @@ void run_command(char *prog) + case 0: + + putenv("SHELL=/bin/sh"); +- args[0] = "/bin/sh"; args[1] = "-c"; args[2] = prog; args[3] = 0; ++ args[0] = "/bin/sh"; args[1] = "-c"; args[2] = prog; args[3] = NULL; + sig_catch(SIGPIPE,SIG_DFL); + execv(*args,args); + printf("Unable to run /bin/sh: %d.", errno); +-- +1.8.4.5 + diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-fix-S-tag-in-case-spamassassin-changed-the-file-size.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-fix-S-tag-in-case-spamassassin-changed-the-file-size.patch new file mode 100644 index 000000000000..db22a6efde42 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-fix-S-tag-in-case-spamassassin-changed-the-file-size.patch @@ -0,0 +1,96 @@ +From fd0a1034e3842ceb573851e62547b26a2b389263 Mon Sep 17 00:00:00 2001 +From: Rolf Eike Beer <eike@sf-mail.de> +Date: Thu, 21 Aug 2014 18:48:52 +0200 +Subject: [PATCH 5/5] fix ,S= tag in case spamassassin changed the file size + +--- + vdelivermail.c | 24 +++++++++++++++++++++--- + 1 file changed, 21 insertions(+), 3 deletions(-) + +diff --git a/vpopmail-5.4.33/vdelivermail.c b/vpopmail-5.4.33/vdelivermail.c +index 2ad2e12..3631c3c 100644 +--- a/vdelivermail.c ++++ b/vdelivermail.c +@@ -351,6 +351,12 @@ static pid_t qmail_inject_open(char *address) + return(pid); + } + ++/** ++ * @returns if delivery worked ++ * @retval 0 message was delivered as is ++ * @retval 1 the file has changed the size during delivery ++ * @retval -1 error ++ */ + static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t headerlen, char *address) + { + char msgbuf[4096]; +@@ -360,6 +366,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t + long unsigned pid; + int pim[2]; + #endif ++ int has_changed_size = 0; + + /* write the Return-Path: and Delivered-To: headers */ + if (headerlen > 0) { +@@ -399,6 +406,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t + close(pim[1]); + dup2(pim[0], 0); + close(pim[0]); ++ has_changed_size = 1; + } + } + #endif +@@ -431,7 +439,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t + if ( write(write_fd, msgbuf, file_count) == -1 ) return -1; + } + +- return 0; ++ return has_changed_size; + } + + void read_quota_from_maildir (const char *maildir, char *qbuf, size_t qlen) +@@ -493,6 +501,7 @@ int deliver_to_maildir ( + size_t headerlen; + int write_fd; + char quota[80]; ++ int fdr; + + headerlen = strlen (extra_headers); + msgsize += headerlen; +@@ -518,7 +527,8 @@ int deliver_to_maildir ( + } + + local = 1; +- if (fdcopy(write_fd, read_fd, extra_headers, headerlen, maildir_to_email(maildir)) != 0) { ++ fdr = fdcopy(write_fd, read_fd, extra_headers, headerlen, maildir_to_email(maildir)); ++ if (fdr < 0) { + /* Did the write fail because we were over quota? */ + if ( errno == EDQUOT ) { + close(write_fd); +@@ -530,6 +540,14 @@ int deliver_to_maildir ( + unlink (local_file_tmp); + return -2; + } ++ } else if (fdr == 1) { ++ /* the file has changed it's size during delivery, e.g. because ++ * SpamAssassin has written it's report to it. */ ++ struct stat st; ++ ++ if (fstat(write_fd, &st) == 0 && st.st_size != msgsize) ++ snprintf(local_file_new, sizeof(local_file_new), "%snew/%lu.%lu.%.32s,S=%lu", ++ maildir, tm, pid, hostname, (long unsigned) st.st_size); + } + + /* completed write to tmp directory, now move it into the new directory */ +@@ -777,7 +795,7 @@ void deliver_mail(char *address, char *quota) + } + + local = 0; +- if (fdcopy (fdm, 0, DeliveredTo, strlen(DeliveredTo), address) != 0) { ++ if (fdcopy (fdm, 0, DeliveredTo, strlen(DeliveredTo), address) < 0) { + printf ("write to qmail-inject failed: %d\n", errno); + close(fdm); + waitpid(inject_pid,&child,0); +-- +1.8.4.5 + diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-fix-those-vfork-instances-that-do-more-than-exec.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-fix-those-vfork-instances-that-do-more-than-exec.patch new file mode 100644 index 000000000000..4f154fcc8d33 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-fix-those-vfork-instances-that-do-more-than-exec.patch @@ -0,0 +1,77 @@ +From de58b5d05fdabf2f17d8a6ec3ef804b59a013242 Mon Sep 17 00:00:00 2001 +From: Rolf Eike Beer <eike@sf-mail.de> +Date: Thu, 21 Aug 2014 17:36:36 +0200 +Subject: [PATCH 2/5] fix those vfork() instances that do more than exec*() + +--- + vdelivermail.c | 4 ++-- + vpopmail.c | 8 ++++---- + vqmaillocal.c | 2 +- + 3 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/vpopmail-5.4.33/vdelivermail.c b/vpopmail-5.4.33/vdelivermail.c +index 241106e..be83a2a 100644 +--- a/vdelivermail.c ++++ b/vdelivermail.c +@@ -330,7 +330,7 @@ static pid_t qmail_inject_open(char *address) + + if ( pipe(pim) == -1) return 0; + +- switch(pid=vfork()){ ++ switch(pid=fork()){ + case -1: + close(pim[0]); + close(pim[1]); +@@ -381,7 +381,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t + !(vpw->pw_gid & NO_SPAMASSASSIN) ) { + + if (!pipe(pim)) { +- pid = vfork(); ++ pid = fork(); + switch (pid) { + case -1: + close(pim[0]); +diff --git a/vpopmail-5.4.33/vpopmail.c b/vpopmail-5.4.33/vpopmail.c +index 5aaeb32..334a8ab 100644 +--- a/vpopmail.c ++++ b/vpopmail.c +@@ -1473,9 +1473,9 @@ int update_newu() + { + int pid; + +- pid=vfork(); ++ pid=fork(); + if ( pid==0){ +- umask(022); ++ umask(022); + execl(QMAILNEWU,"qmail-newu", NULL); + exit(127); + } else { +@@ -3366,9 +3366,9 @@ long unsigned tcprules_open() + /* create a pair of filedescriptors for our pipe */ + if (pipe(pim) == -1) { return(-1);} + +- switch( pid=vfork()){ ++ switch( pid=fork()){ + case -1: +- /* vfork error. close pipes and exit */ ++ /* fork error. close pipes and exit */ + close(pim[0]); close(pim[1]); + return(-1); + case 0: +diff --git a/vpopmail-5.4.33/vqmaillocal.c b/vpopmail-5.4.33/vqmaillocal.c +index 6d3068c..80efa24 100644 +--- a/vqmaillocal.c ++++ b/vqmaillocal.c +@@ -359,7 +359,7 @@ long unsigned qmail_inject_open(char *address) + + if ( pipe(pim) == -1) return(-1); + +- switch(pid=vfork()){ ++ switch(pid=fork()){ + case -1: + close(pim[0]); + close(pim[1]); +-- +1.8.4.5 + diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-remove-unneeded-forward-declaration.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-remove-unneeded-forward-declaration.patch new file mode 100644 index 000000000000..23ec43be0242 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-remove-unneeded-forward-declaration.patch @@ -0,0 +1,24 @@ +From 32ce986d86695dd55d4c888c30fe62b910b99f17 Mon Sep 17 00:00:00 2001 +From: Rolf Eike Beer <eike@sf-mail.de> +Date: Thu, 21 Aug 2014 17:45:28 +0200 +Subject: [PATCH 3/5] remove unneeded forward declaration + +--- + vchkpw.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/vpopmail-5.4.33/vchkpw.c b/vpopmail-5.4.33/vchkpw.c +index b1c8a5d..d7d4351 100644 +--- a/vchkpw.c ++++ b/vchkpw.c +@@ -91,7 +91,6 @@ void login_system_user(); + void read_user_pass(); + void vlog(int verror, char *TheUser, char *TheDomain, char *ThePass, char *TheName, char *IpAddr, char *LogLine); + void vchkpw_exit(int err); +-void run_command(char *prog); + int authcram( char *response, char *challenge, char *password); + int authapop( char *password, char *timestamp, char *clearpass); + +-- +1.8.4.5 + diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-strncat.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-strncat.patch new file mode 100644 index 000000000000..f3c9c71b2993 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-strncat.patch @@ -0,0 +1,166 @@ +https://sourceforge.net/p/vpopmail/patches/98/ + +--- a/vpopmaild.c (revision 998) ++++ b/vpopmaild.c (working copy) +@@ -1326,7 +1326,7 @@ + } + } + snprintf(newpath, MAXPATH, "%s",myvpw->pw_dir); +- strncat(newpath, &path[i], MAXPATH ); ++ strncat(newpath, &path[i], MAXPATH-strlen(newpath)-1); + } else { /* may be domain name */ + for(i=0;path[i]!='/'&&path[i]!=0&&i<256;++i) { + thedomain[i] = path[i]; +@@ -1337,7 +1337,7 @@ + return(9); + } + snprintf(newpath, MAXPATH, "%s", thedir); +- strncat(newpath, &path[i], MAXPATH ); ++ strncat(newpath, &path[i], MAXPATH-strlen(newpath)-1); + } + } + +@@ -1459,23 +1459,23 @@ + } + snprintf( WriteBuf, sizeof(WriteBuf), "%s", mydirent->d_name); + if ( S_ISREG(statbuf.st_mode ) ) { +- strncat(WriteBuf," file", sizeof(WriteBuf)); ++ strncat(WriteBuf," file", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else if ( S_ISDIR(statbuf.st_mode ) ) { +- strncat(WriteBuf," dir", sizeof(WriteBuf)); ++ strncat(WriteBuf," dir", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else if ( S_ISCHR(statbuf.st_mode ) ) { +- strncat(WriteBuf," chardev", sizeof(WriteBuf)); ++ strncat(WriteBuf," chardev", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else if ( S_ISBLK(statbuf.st_mode ) ) { +- strncat(WriteBuf," blkdev", sizeof(WriteBuf)); ++ strncat(WriteBuf," blkdev", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else if ( S_ISFIFO(statbuf.st_mode ) ) { +- strncat(WriteBuf," fifo", sizeof(WriteBuf)); ++ strncat(WriteBuf," fifo", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else if ( S_ISLNK(statbuf.st_mode ) ) { +- strncat(WriteBuf," link", sizeof(WriteBuf)); ++ strncat(WriteBuf," link", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else if ( S_ISSOCK(statbuf.st_mode ) ) { +- strncat(WriteBuf," sock", sizeof(WriteBuf)); ++ strncat(WriteBuf," sock", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else { +- strncat(WriteBuf," unknown", sizeof(WriteBuf)); ++ strncat(WriteBuf," unknown", sizeof(WriteBuf)-strlen(WriteBuf)-1); + } +- strncat(WriteBuf,RET_CRLF, sizeof(WriteBuf)); ++ strncat(WriteBuf,RET_CRLF, sizeof(WriteBuf)-strlen(WriteBuf)-1); + wait_write(); + } + if ( closedir(mydir) < 0 ) { +@@ -1604,7 +1604,7 @@ + while(fgets(tmpbuf,sizeof(tmpbuf),fs)!=NULL){ + if ( strcmp(tmpbuf, "." RET_CRLF) == 0 || strcmp(tmpbuf, ".\n") == 0 ) { + snprintf(WriteBuf, sizeof(WriteBuf), "%s", "."); +- strncat(WriteBuf, tmpbuf, sizeof(WriteBuf)); ++ strncat(WriteBuf, tmpbuf, sizeof(WriteBuf)-strlen(WriteBuf)-1); + } else { + memcpy(WriteBuf,tmpbuf,sizeof(tmpbuf)); + } +--- a/vmysql.c (revision 998) ++++ b/vmysql.c (working copy) +@@ -731,7 +731,7 @@ + ); + + if ( sortit == 1 ) { +- strncat( SqlBufRead, " order by pw_name", SQL_BUF_SIZE); ++ strncat( SqlBufRead, " order by pw_name", SQL_BUF_SIZE-strlen(SqlBufRead)-1); + } + + if (res_read!=NULL) mysql_free_result(res_read_getall); +--- a/vldap.c (revision 998) ++++ b/vldap.c (working copy) +@@ -1022,7 +1022,7 @@ + + /* if we are lucky the domain is in the assign file */ + if ( vget_assign(domain,dir_control_file,MAX_DIR_NAME,NULL,NULL)!=NULL ) { +- strncat(dir_control_file, "/.dir-control", MAX_DIR_NAME); ++ strncat(dir_control_file, "/.dir-control", MAX_DIR_NAME-strlen(dir_control_file)-1); + + /* it isn't in the assign file so we have to get it from /etc/passwd */ + } else { +@@ -1041,7 +1041,7 @@ + } + + /* stick on the rest of the path */ +- strncat(dir_control_file, "/" DOMAINS_DIR "/.dir-control", MAX_DIR_NAME); ++ strncat(dir_control_file, "/" DOMAINS_DIR "/.dir-control", MAX_DIR_NAME-strlen(dir_control_file)-1); + } + return(dir_control_file); + } +@@ -1177,7 +1177,7 @@ + char dir_control_file[MAX_DIR_NAME]; + + vget_assign(domain, dir_control_file, 156, NULL,NULL); +- strncat(dir_control_file,"/.dir-control", MAX_DIR_NAME); ++ strncat(dir_control_file,"/.dir-control", MAX_DIR_NAME-strlen(dir_control_file)-1); + return(unlink(dir_control_file)); + } + +--- a/vpopmail.c (revision 998) ++++ b/vpopmail.c (working copy) +@@ -1900,8 +1900,8 @@ + + // Copy the rest of the terms into the domain name + for(j=1;j<i;j++) { +- strncat( domain, ".", MAX_BUFF ); +- strncat( domain, parts[j], MAX_BUFF ); ++ strncat( domain, ".", MAX_BUFF-strlen(domain)-1); ++ strncat( domain, parts[j], MAX_BUFF-strlen(domain)-1); + } + + } +--- a/vcdb.c (revision 998) ++++ b/vcdb.c (working copy) +@@ -271,7 +271,7 @@ + } + + strncpy(line,user,sizeof(line)); +- strncat(line,":",sizeof(line)); ++ strncat(line,":",sizeof(line)-strlen(line)-1); + ptr = line; + while (*ptr != ':') { ptr++; } + ptr++; +@@ -1055,7 +1055,7 @@ + char dir_control_file[MAX_DIR_NAME]; + + vget_assign(domain, dir_control_file, 156, NULL,NULL); +- strncat(dir_control_file,"/.dir-control", MAX_DIR_NAME); ++ strncat(dir_control_file,"/.dir-control", MAX_DIR_NAME-strlen(dir_control_file)-1); + return(unlink(dir_control_file)); + } + +@@ -1120,7 +1120,7 @@ + + /* if we are lucky the domain is in the assign file */ + if ( vget_assign(domain,dir_control_file,MAX_DIR_NAME,NULL,NULL)!=NULL ) { +- strncat(dir_control_file, "/.dir-control", MAX_DIR_NAME); ++ strncat(dir_control_file, "/.dir-control", MAX_DIR_NAME-strlen(dir_control_file)-1); + + /* it isn't in the assign file so we have to get it from /etc/passwd */ + } else { +@@ -1139,7 +1139,7 @@ + } + + /* stick on the rest of the path */ +- strncat(dir_control_file, "/" DOMAINS_DIR "/.dir-control", MAX_DIR_NAME); ++ strncat(dir_control_file, "/" DOMAINS_DIR "/.dir-control", MAX_DIR_NAME-strlen(dir_control_file)-1); + } + return(dir_control_file); + } +--- a/vpgsql.c (revision 998) ++++ b/vpgsql.c (working copy) +@@ -522,7 +522,7 @@ + #endif + ); + if ( sortit == 1 ) { +- strncat( SqlBufRead, " order by pw_name", SQL_BUF_SIZE); ++ strncat( SqlBufRead, " order by pw_name", SQL_BUF_SIZE-strlen(SqlBufRead)-1); + } + if ( pgres ) { /* reset state if we had previous result */ + PQclear(pgres); // clear previous result diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-unistd.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-unistd.patch new file mode 100644 index 000000000000..803276f89ad5 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-unistd.patch @@ -0,0 +1,9 @@ +--- vpopmail-5.4.33-orig/cdb/cdb_seek.c 2019-09-25 23:01:01.332000000 +0200 ++++ vpopmail-5.4.33/cdb/cdb_seek.c 2019-09-25 23:03:04.112000000 +0200 +@@ -1,5 +1,6 @@ + #include <sys/types.h> + #include <errno.h> ++#include <unistd.h> + #include "cdb.h" + + #ifndef SEEK_SET diff --git a/net-mail/vpopmail/files/vpopmail-5.4.33-vdelivermail-add-static.patch b/net-mail/vpopmail/files/vpopmail-5.4.33-vdelivermail-add-static.patch new file mode 100644 index 000000000000..88306872b484 --- /dev/null +++ b/net-mail/vpopmail/files/vpopmail-5.4.33-vdelivermail-add-static.patch @@ -0,0 +1,34 @@ +From 31bef5aeeaf1e24eb40e84e41312dd6ae865ee03 Mon Sep 17 00:00:00 2001 +From: Rolf Eike Beer <eike@sf-mail.de> +Date: Thu, 21 Aug 2014 17:34:27 +0200 +Subject: [PATCH 1/5] vdelivermail: add static + +--- + vdelivermail.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/vpopmail-5.4.33/vdelivermail.c b/vpopmail-5.4.33/vdelivermail.c +index d94129f..241106e 100644 +--- a/vdelivermail.c ++++ b/vdelivermail.c +@@ -322,7 +322,7 @@ int process_valias(void) + #endif + + /* Forks off qmail-inject. Returns PID of child, or 0 for failure. */ +-pid_t qmail_inject_open(char *address) ++static pid_t qmail_inject_open(char *address) + { + int pim[2]; + pid_t pid; +@@ -351,7 +351,7 @@ pid_t qmail_inject_open(char *address) + return(pid); + } + +-int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t headerlen, char *address) ++static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t headerlen, char *address) + { + char msgbuf[4096]; + ssize_t file_count; +-- +1.8.4.5 + |