# HG changeset patch # User Michael Terry # Date 1228591881 0 # Node ID a95356c17b5c4ab4ed5885c3eb31aed3da904964 # Parent eacf48c09ccc1243bb35299b844fcd54e6a77b8b Fix a Zephyr crash and 10-second delay that can happen when you have an account configured to use tzc but either tzc is installed or the configured tzc path is invalid. Fixes #7700. committer: John Bailey diff -r eacf48c09ccc -r a95356c17b5c COPYRIGHT --- a/COPYRIGHT Sat Dec 06 19:16:21 2008 +0000 +++ b/COPYRIGHT Sat Dec 06 19:31:21 2008 +0000 @@ -418,6 +418,7 @@ Brian Tarricone Peter Teichman Philip Tellis +Michael Terry Arun A. Tharuvai Cestonaro Thilo Will Thompson diff -r eacf48c09ccc -r a95356c17b5c libpurple/protocols/zephyr/zephyr.c --- a/libpurple/protocols/zephyr/zephyr.c Sat Dec 06 19:16:21 2008 +0000 +++ b/libpurple/protocols/zephyr/zephyr.c Sat Dec 06 19:31:21 2008 +0000 @@ -1607,27 +1607,21 @@ gboolean found_ps = FALSE; gchar ** tzc_cmd_array = g_strsplit(purple_account_get_string(gc->account,"tzc_command","/usr/bin/tzc -e %s")," ",0); if (close(1) == -1) { - purple_debug_error("zephyr", "stdout couldn't be closed. dying\n"); exit(-1); } if (dup2(zephyr->fromtzc[1], 1) == -1) { - purple_debug_error("zephyr", "dup2 of stdout failed \n"); exit(-1); } if (close(zephyr->fromtzc[1]) == -1) { - purple_debug_error("zephyr", "closing of piped stdout failed\n"); exit(-1); } if (close(0) == -1) { - purple_debug_error("zephyr", "stdin couldn't be closed. dying\n"); exit(-1); } if (dup2(zephyr->totzc[0], 0) == -1) { - purple_debug_error("zephyr", "dup2 of stdin failed \n"); exit(-1); } if (close(zephyr->totzc[0]) == -1) { - purple_debug_error("zephyr", "closing of piped stdin failed\n"); exit(-1); } /* tzc_command should really be of the form @@ -1651,11 +1645,11 @@ } if (!found_ps) { - purple_connection_error(gc,"Tzc command needs %s to set the exposure\n"); - return; + exit(-1); } execvp(tzc_cmd_array[0], tzc_cmd_array); + exit(-1); } else { fd_set rfds; @@ -1667,6 +1661,7 @@ int parenlevel=0; char* tempstr; int tempstridx; + int select_status; zephyr->tzc_pid = pid; /* wait till we have data to read from ssh */ @@ -1678,11 +1673,19 @@ purple_debug_info("zephyr", "about to read from tzc\n"); - select(zephyr->fromtzc[ZEPHYR_FD_READ] + 1, &rfds, NULL, NULL, NULL); + if (waitpid(pid, NULL, WNOHANG) == 0) { // Only select if tzc is still running + purple_debug_info("zephyr", "about to read from tzc\n"); + select_status = select(zephyr->fromtzc[ZEPHYR_FD_READ] + 1, &rfds, NULL, NULL, NULL); + } + else { + purple_debug_info("zephyr", "tzc exited early\n"); + select_status = -1; + } FD_ZERO(&rfds); FD_SET(zephyr->fromtzc[ZEPHYR_FD_READ], &rfds); - while (select(zephyr->fromtzc[ZEPHYR_FD_READ] + 1, &rfds, NULL, NULL, &tv)) { + while (select_status > 0 && + select(zephyr->fromtzc[ZEPHYR_FD_READ] + 1, &rfds, NULL, NULL, &tv) > 0) { read(zephyr->fromtzc[ZEPHYR_FD_READ], bufcur, 1); bufcur++; if ((bufcur - buf) > (bufsize - 1)) {