diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2013-03-07 16:25:44 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2013-03-07 16:26:27 +0000 |
commit | a95db6d139ac578a9d4e37c94bc179c4aa9a1419 (patch) | |
tree | cf568561d91d673104abad69f7ad2c0be633f281 | |
parent | 02608d80cbe6f907dc29b0a1612f5cacd11d42a9 (diff) | |
download | aports-a95db6d139ac578a9d4e37c94bc179c4aa9a1419.tar.bz2 aports-a95db6d139ac578a9d4e37c94bc179c4aa9a1419.tar.xz |
main/sircbot: fix segfault when server disconnects
-rw-r--r-- | main/sircbot/APKBUILD | 6 | ||||
-rw-r--r-- | main/sircbot/disconnect-fix.patch | 194 |
2 files changed, 199 insertions, 1 deletions
diff --git a/main/sircbot/APKBUILD b/main/sircbot/APKBUILD index bd4173b13e..e00ccb232b 100644 --- a/main/sircbot/APKBUILD +++ b/main/sircbot/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=sircbot pkgver=0.2 -pkgrel=5 +pkgrel=6 pkgdesc="Minimalistic IRC bot" url="http://git.alpinelinux.org/cgit/sircbot/" arch="all" @@ -13,6 +13,7 @@ makedepends="lua-dev" install="$pkgname.pre-install" subpackages="lua-sircbot:luamod" source="http://git.alpinelinux.org/cgit/sircbot.git/snapshot/sircbot-$pkgver.tar.bz2 + disconnect-fix.patch sircbot.initd sircbot.confd " @@ -42,11 +43,14 @@ luamod() { } md5sums="a9d16db48c97ebfa30e1c84f37e70838 sircbot-0.2.tar.bz2 +4ba720163ca111f1cb7c9c369a370e05 disconnect-fix.patch 1451771566a969550ef3c0ced26fc9bb sircbot.initd 8443ac189030c7b8beb8e579dc16ebc7 sircbot.confd" sha256sums="572ee420fc7dbc4732c3d51841694f2b8800f22eea9909c9047c45b4eca847d8 sircbot-0.2.tar.bz2 +61da3159e48426f04f1fb4df31420a3faa72b52b6fddb342709406f89025a554 disconnect-fix.patch f554417bd15db266ccf05f4f193ee45cb5a318230543a3fb39fb2b37a3050988 sircbot.initd b0bf9767150e486815aada1761b6fca7b7838df3045082ff8083167dbce613e6 sircbot.confd" sha512sums="4afac87a63fe76314168fa363dee8766a03c85ae3cd603096e4f33b26823333a9dadf30e773af019d4c7c3bd83dce5838f967071c6393a02d844dc6a30768c7a sircbot-0.2.tar.bz2 +ab0102d04b42826102ee705dc2b4a3202391619b4df7365bda8cc47715a0537a1656bcc32869628e70aa3467837dd7a7ca6aac6843c3fd046aba7832fed91ed6 disconnect-fix.patch 00c8a90a0c12b052622b674bd81b426303a0a43cdf01c808e421938782074758ad6d3021165bb6fde49557b0a62d42bda62dd871c4d093f35b7adba1abc024cb sircbot.initd 315167ec664ce859908fcd230f6e0c604a0b02e56286156ba6ec76c32d6d514726acb493fe7a13b44d9255ec2e34fe4b2a6f02edf039b06e487cea6528d4d6a7 sircbot.confd" diff --git a/main/sircbot/disconnect-fix.patch b/main/sircbot/disconnect-fix.patch new file mode 100644 index 0000000000..523264a632 --- /dev/null +++ b/main/sircbot/disconnect-fix.patch @@ -0,0 +1,194 @@ +From 93d007481e25c9db88e8b16117b0378d51951bb6 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Thu, 07 Mar 2013 15:20:22 +0000 +Subject: fix segfault when IRC server does disconnect + +and fix lots of whitespace damage +--- +diff --git a/irc.c b/irc.c +index 92a925e..5832421 100644 +--- a/irc.c ++++ b/irc.c +@@ -14,11 +14,11 @@ static int tcp_connect(const char *host, int port) + struct sockaddr_in addr; + struct hostent *h; + int sock = socket(AF_INET, SOCK_STREAM, 0); +- if (sock < 0) ++ if (sock < 0) + return sock; + + h = gethostbyname(host); +- if (h == NULL) ++ if (h == NULL) + return -1; + + memset(&addr, 0, sizeof(addr)); +@@ -38,17 +38,17 @@ struct irc_session *irc_connect(const char* server, int port, const char *nick, + { + char buf[256]; + struct irc_session *sess; +- ++ + sess = malloc(sizeof(struct irc_session)); + if (sess == NULL) + return NULL; +- ++ + sess->nick = nick; + sess->server = server; + sess->fd = tcp_connect(server, port); +- if (sess->fd < 0) ++ if (sess->fd < 0) + return NULL; +- ++ + /* login */ + if (pass) + irc_send(sess, "PASS", pass); +@@ -79,7 +79,9 @@ int irc_send_ping(struct irc_session *s) + + int irc_close(struct irc_session *s, const char *msg) + { +- irc_send(s, "QUIT", msg ? msg : ""); +- close(s->fd); ++ if (s->fd > 0) { ++ irc_send(s, "QUIT", msg ? msg : ""); ++ close(s->fd); ++ } + free(s); + } +diff --git a/sircbot.c b/sircbot.c +index b85d7d0..7d9c1a3 100644 +--- a/sircbot.c ++++ b/sircbot.c +@@ -56,8 +56,8 @@ struct sircbot_socket_callback { + int (*callback)(struct sircbot_session *sb, struct pollfd *fds, + void *ctx); + }; +- +- ++ ++ + static int foreground = 0; + static int sigterm = 0; + static int flush_rate = 2; +@@ -90,7 +90,7 @@ int daemonize(const char *pidfile, const char *logfile) + /* exit parent */ + if (pid > 0) + exit(0); +- ++ + /* detatch to controling terminal */ + setsid(); + +@@ -220,10 +220,10 @@ int run_hooks(char *user, char *rcpt, char* data) + /* exit parent */ + if (pid > 0) + exit(0); +- ++ + snprintf(dir, sizeof(dir), "/etc/" PROGNAME ".d/%s", rcpt); + printf("DEBUG: running scripts in %s\n", dir); +- execlp("/bin/run-parts", "/bin/run-parts", "-a", user, ++ execlp("/bin/run-parts", "/bin/run-parts", "-a", user, + "-a", data, "-a", rcpt, dir, NULL); + log_err("run-parts"); + exit(1); +@@ -302,17 +302,21 @@ int parse_irc_data(struct sircbot_session *sb, char *buf) + } + + /* callback functions */ +-static int irc_server_cb(struct sircbot_session *sb, struct pollfd *fds, ++static int irc_server_cb(struct sircbot_session *sb, struct pollfd *fds, + void *ctx) + { + char buf[4096]; + int r; + struct irc_session *sess = (struct irc_session *) ctx; + +- if (fds->revents & POLLHUP) ++ if (fds->revents & POLLHUP) { + /* server hang up on us */ ++ printf("DEBUG: %s: connection closed\n", sess ? sess->server : "null"); ++ close(sess->fd); ++ sess->fd = -1; + return 0; +- ++ } ++ + if (fds->revents & POLLERR) { + log_err(sess->server); + return -1; +@@ -340,7 +344,7 @@ int channel_extend_fd_array(struct sircbot_channel *chan) + chan->fd_array[i] = -1; + return 0; + } +- ++ + + void channel_add_connection(struct sircbot_channel *chan, int fd) + { +@@ -428,7 +432,7 @@ static int irc_reset_pollfds(struct sircbot_session *sb, struct pollfd *fds, + fds[n].fd = sb->sess->fd; + fds[n].events = POLLIN; + fds[n].revents = 0; +- cb[n].context = NULL; ++ cb[n].context = sb->sess; + cb[n].callback = &irc_server_cb; + n++; + +@@ -474,18 +478,24 @@ static int send_fifo_queue(struct irc_session *sess, + return r; + } + +-static void join_channels(struct sircbot_session *sb) ++static int join_channels(struct sircbot_session *sb) + { + time_t now = time(NULL); + int i; + /* wait atleast 5 secs before we join a channel */ + for (i = 0; i < sb->numchan; i++) +- if ((now - sb->chan[i].last_closetime) > 5 +- && sb->chan[i].listen_fd < 0) { ++ if ((now - sb->chan[i].last_closetime) > 5 ++ && sb->chan[i].listen_fd < 0 && sb->sess != NULL) { ++ int r = 0; + printf("DEBUG: joining %s\n", sb->chan[i].name); + sb->chan[i].last_closetime = now; +- irc_send(sb->sess, "JOIN", sb->chan[i].name); ++ r = irc_send(sb->sess, "JOIN", sb->chan[i].name); ++ if (r < 0) { ++ printf("DEBUG: error %s: %s\n", sb->sess->server, strerror(r)); ++ return r; ++ } + } ++ return 0; + } + + static int irc_loop(struct sircbot_session *sb) +@@ -504,7 +514,8 @@ static int irc_loop(struct sircbot_session *sb) + tv.tv_sec = 1; + tv.tv_nsec = 0; + while (!sigterm) { +- join_channels(sb); ++ if (join_channels(sb) < 0) ++ goto ret_err; + n = irc_reset_pollfds(sb, fds, cbs, maxfds); + r = ppoll(fds, n, &tv, &sigmask); + if (r < 0) { +@@ -633,11 +644,11 @@ int main(int argc, char *argv[]) + sleep(10); + continue; + } +- ++ + irc_loop(&sb); + irc_close(sb.sess, "bye"); + /* reset channel sockets */ +- for (i = 0; i < argc; i++) ++ for (i = 0; i < argc; i++) + close_channel_socket(&sb.chan[i], 0); + if (sigterm) + break; +-- +cgit v0.9.0.3 |