8e5db79efa
Submitted by Maxime Guillaud <bsd-ports@mguillaud.net>. akpop3d is a POP3 daemon aimed to be small and secure. It is stand-alone, very small, easy to modify. Despite its small size, it offers a lot of features.
110 lines
3.5 KiB
Plaintext
110 lines
3.5 KiB
Plaintext
$OpenBSD: patch-pop3_session_c,v 1.1.1.1 2004/11/08 21:57:05 naddy Exp $
|
|
--- pop3_session.c.orig Sun Aug 17 19:44:55 2003
|
|
+++ pop3_session.c Fri Aug 27 01:45:07 2004
|
|
@@ -35,6 +35,7 @@
|
|
|
|
extern const char * ssl_certfile;
|
|
extern const char * ssl_keyfile;
|
|
+extern const char * group_name;
|
|
extern const char * local_mbox;
|
|
extern char real_username[MAXLINE+1];
|
|
extern char real_maildrop[MAXLINE+1];
|
|
@@ -45,8 +46,17 @@ extern const char * mailspool;
|
|
int authenticate(char * username, char * password);
|
|
void show_uidl(int fd, char * line);
|
|
|
|
-static void do_remove_lock(void) {
|
|
+static void do_remove_lock(int fd) {
|
|
do_cleanup();
|
|
+ if (remove_lock(mdl)) {
|
|
+ syslog(LOG_ERR,"unable to unlink lock file %s : %m",mdl);
|
|
+ write_line(fd,"unable to unlink lock file - see syslog\r\n");
|
|
+ exit(EXIT_FAILURE);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void cleanup_before_exit(void) {
|
|
+ do_cleanup();
|
|
remove_lock(mdl);
|
|
}
|
|
|
|
@@ -64,8 +74,9 @@ static void print_capa(int fd) {
|
|
|
|
|
|
static void sig_handler(int signo) {
|
|
- remove_lock(mdl);
|
|
syslog(LOG_INFO,"%s: %u", "caught signal",signo);
|
|
+ if (remove_lock(mdl))
|
|
+ syslog(LOG_ERR,"unable to unlink lock file for user %s : %m",mdl);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
@@ -227,21 +238,21 @@ void pop3_session(int fd) {
|
|
|
|
mdl = maildrop;
|
|
|
|
- g_inf = getgrnam("mail");
|
|
+ g_inf = getgrnam(group_name);
|
|
if (g_inf==NULL) {
|
|
- syslog(LOG_ERR,"%s","group 'mail' not found");
|
|
- write_line(fd,"-ERR [SYS/TEMP] group 'mail' not found\r\n");
|
|
+ syslog(LOG_ERR,"group '%s' not found",group_name);
|
|
+ write_line(fd,"-ERR [SYS/TEMP] group not found\r\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (setegid(g_inf->gr_gid)!=0 && real_username[0] == 0) {
|
|
syslog(LOG_ERR,"%s: %u: %s","setegid() failed",g_inf->gr_gid,strerror(errno));
|
|
- write_line(fd,"-ERR [SYS/TEMP] failed to join 'mail' group (setegid)\r\n");
|
|
+ write_line(fd,"-ERR [SYS/TEMP] failed to join group (setegid)\r\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
if (setgid(g_inf->gr_gid)!=0 && real_username[0] == 0) {
|
|
syslog(LOG_ERR,"%s: %u: %s","setgid() failed",g_inf->gr_gid,strerror(errno));
|
|
- write_line(fd,"-ERR [SYS/TEMP] failed to join 'mail' group (setgid)\r\n");
|
|
+ write_line(fd,"-ERR [SYS/TEMP] failed to join group (setgid)\r\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
@@ -258,18 +269,18 @@ void pop3_session(int fd) {
|
|
if (setuid(u_inf->pw_uid)!=0) {
|
|
syslog(LOG_ERR,"%s: %u: %s","setuid() failed",u_inf->pw_uid,strerror(errno));
|
|
write_line(fd,"-ERR [SYS/TEMP] failed to set user identity\r\n");
|
|
- do_remove_lock();
|
|
+ do_remove_lock(fd);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
if (seteuid(u_inf->pw_uid)!=0) {
|
|
syslog(LOG_ERR,"%s: %u: %s","seteuid() failed",u_inf->pw_uid,strerror(errno));
|
|
write_line(fd,"-ERR [SYS/TEMP] failed to set effective user identity\r\n");
|
|
- do_remove_lock();
|
|
+ do_remove_lock(fd);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
- if (atexit(do_remove_lock)!=0) {
|
|
+ if (atexit(cleanup_before_exit)!=0) {
|
|
syslog(LOG_WARNING,"%s: %s","atexit() failed; lock files may fail to expire",strerror(errno));
|
|
}
|
|
|
|
@@ -278,7 +289,7 @@ void pop3_session(int fd) {
|
|
if (process_mails(maildrop)==0) {
|
|
write_line(fd,"-ERR [SYS/PERM] failed to scan maildrop contents\r\n");
|
|
do_cleanup();
|
|
- do_remove_lock();
|
|
+ do_remove_lock(fd);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
@@ -334,5 +345,8 @@ void pop3_session(int fd) {
|
|
do_update(maildrop);
|
|
}
|
|
do_cleanup();
|
|
- remove_lock(maildrop);
|
|
+ if (remove_lock(maildrop)) {
|
|
+ syslog(LOG_ERR,"unable to unlink lock file %s : %m",maildrop);
|
|
+ exit(EXIT_FAILURE);
|
|
+ }
|
|
}
|