comparison common-session.c @ 1151:a550e1e2e2a9

make sure that the test for queued packets to write occurs after those packets might have been enqueued by set_connect_fds()
author Matt Johnston <matt@ucc.asn.au>
date Tue, 29 Sep 2015 21:53:27 +0800
parents 924ff1b959a2
children b370b4b172d0
comparison
equal deleted inserted replaced
1150:261535598456 1151:a550e1e2e2a9
157 timeout.tv_usec = 0; 157 timeout.tv_usec = 0;
158 FD_ZERO(&writefd); 158 FD_ZERO(&writefd);
159 FD_ZERO(&readfd); 159 FD_ZERO(&readfd);
160 dropbear_assert(ses.payload == NULL); 160 dropbear_assert(ses.payload == NULL);
161 161
162 /* We get woken up when signal handlers write to this pipe.
163 SIGCHLD in svr-chansession is the only one currently. */
164 FD_SET(ses.signal_pipe[0], &readfd);
165
166 /* set up for channels which can be read/written */
167 setchannelfds(&readfd, &writefd, writequeue_has_space);
168
169 /* Pending connections to test */
170 set_connect_fds(&writefd);
171
162 /* We delay reading from the input socket during initial setup until 172 /* We delay reading from the input socket during initial setup until
163 after we have written out our initial KEXINIT packet (empty writequeue). 173 after we have written out our initial KEXINIT packet (empty writequeue).
164 This means our initial packet can be in-flight while we're doing a blocking 174 This means our initial packet can be in-flight while we're doing a blocking
165 read for the remote ident. 175 read for the remote ident.
166 We also avoid reading from the socket if the writequeue is full, that avoids 176 We also avoid reading from the socket if the writequeue is full, that avoids
168 if (ses.sock_in != -1 178 if (ses.sock_in != -1
169 && (ses.remoteident || isempty(&ses.writequeue)) 179 && (ses.remoteident || isempty(&ses.writequeue))
170 && writequeue_has_space) { 180 && writequeue_has_space) {
171 FD_SET(ses.sock_in, &readfd); 181 FD_SET(ses.sock_in, &readfd);
172 } 182 }
183
184 /* Ordering is important, this test must occur after any other function
185 might have queued packets (such as connection handlers) */
173 if (ses.sock_out != -1 && !isempty(&ses.writequeue)) { 186 if (ses.sock_out != -1 && !isempty(&ses.writequeue)) {
174 FD_SET(ses.sock_out, &writefd); 187 FD_SET(ses.sock_out, &writefd);
175 } 188 }
176
177 /* We get woken up when signal handlers write to this pipe.
178 SIGCHLD in svr-chansession is the only one currently. */
179 FD_SET(ses.signal_pipe[0], &readfd);
180
181 /* set up for channels which can be read/written */
182 setchannelfds(&readfd, &writefd, writequeue_has_space);
183
184 /* Pending connections to test */
185 set_connect_fds(&writefd);
186 189
187 val = select(ses.maxfd+1, &readfd, &writefd, NULL, &timeout); 190 val = select(ses.maxfd+1, &readfd, &writefd, NULL, &timeout);
188 191
189 if (exitflag) { 192 if (exitflag) {
190 dropbear_exit("Terminated by signal"); 193 dropbear_exit("Terminated by signal");