summaryrefslogtreecommitdiffstats
path: root/main/sircbot
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2013-03-07 16:25:44 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2013-03-07 16:26:27 +0000
commita95db6d139ac578a9d4e37c94bc179c4aa9a1419 (patch)
treecf568561d91d673104abad69f7ad2c0be633f281 /main/sircbot
parent02608d80cbe6f907dc29b0a1612f5cacd11d42a9 (diff)
downloadaports-a95db6d139ac578a9d4e37c94bc179c4aa9a1419.tar.bz2
aports-a95db6d139ac578a9d4e37c94bc179c4aa9a1419.tar.xz
main/sircbot: fix segfault when server disconnects
Diffstat (limited to 'main/sircbot')
-rw-r--r--main/sircbot/APKBUILD6
-rw-r--r--main/sircbot/disconnect-fix.patch194
2 files changed, 199 insertions, 1 deletions
diff --git a/main/sircbot/APKBUILD b/main/sircbot/APKBUILD
index bd4173b13..e00ccb232 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 000000000..523264a63
--- /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