fix mess with queue
Oleg
9 years ago
138 | 138 | Q_BUF => 2, |
139 | 139 | Q_READS => 3, |
140 | 140 | Q_SENDS => 4, |
141 | Q_DEBUGS => 5, | |
141 | Q_OKCB => 5, | |
142 | Q_DEBUGS => 6, | |
142 | 143 | }; |
143 | 144 | |
144 | 145 | |
426 | 427 | |
427 | 428 | last if ($retval == -1); |
428 | 429 | ${*$self}->{SOCKS}->{queue_results}{ $elt->[Q_SUB] } = $retval; |
430 | if ($elt->[Q_OKCB]) { | |
431 | $elt->[Q_OKCB]->(); | |
432 | } | |
429 | 433 | shift @{ ${*$self}->{SOCKS}->{queue} }; |
430 | 434 | } |
431 | 435 | |
432 | 436 | if (defined($retval) && !@{ ${*$self}->{SOCKS}->{queue} }) { |
433 | 437 | ${*$self}->{SOCKS}->{queue_results} = {}; |
434 | ${*$self}->{SOCKS}->{ready} = 1; | |
438 | ${*$self}->{SOCKS}->{ready} = $SOCKS_ERROR ? 0 : 1; | |
435 | 439 | } |
436 | 440 | |
437 | 441 | return $retval; |
1165 | 1169 | $dstaddr = length($request) == 16 ? Socket::inet_ntop(AF_INET6, $request) : undef; |
1166 | 1170 | } |
1167 | 1171 | else { # unknown address type - how many bytes to read? |
1168 | ${*$self}->{SOCKS}->{queue} = [ [ '_socks5_accept_command_reply', [ REPLY_ADDR_NOT_SUPPORTED, '0.0.0.0', 0 ], undef, [], 0 ] ]; | |
1169 | $! = ESOCKSPROTO; | |
1170 | $SOCKS_ERROR->set(REPLY_ADDR_NOT_SUPPORTED, $@ = $CODES{REPLY}->{REPLY_ADDR_NOT_SUPPORTED}); | |
1171 | return 1; | |
1172 | push @{${*$self}->{SOCKS}->{queue}}, [ | |
1173 | '_socks5_accept_command_reply', [ REPLY_ADDR_NOT_SUPPORTED, '0.0.0.0', 0 ], undef, [], 0, | |
1174 | sub { | |
1175 | $! = ESOCKSPROTO; | |
1176 | $SOCKS_ERROR->set(REPLY_ADDR_NOT_SUPPORTED, $@ = $CODES{REPLY}->{REPLY_ADDR_NOT_SUPPORTED}); | |
1177 | } | |
1178 | ]; | |
1179 | ||
1180 | return 0; | |
1172 | 1181 | } |
1173 | 1182 | |
1174 | 1183 | $request = $self->_socks_read(2, ++$reads) |
1324 | 1333 | |
1325 | 1334 | if (defined(${*$self}->{SOCKS}->{UserAuth})) { |
1326 | 1335 | unless (&{ ${*$self}->{SOCKS}->{UserAuth} }($userid)) { |
1327 | ${*$self}->{SOCKS}->{queue} = [ [ '_socks4_accept_command_reply', [ REQUEST_REJECTED_USERID, '0.0.0.0', 0 ], undef, [], 0 ] ]; | |
1328 | $! = ESOCKSPROTO; | |
1329 | $SOCKS_ERROR->set(REQUEST_REJECTED_USERID, $@ = 'Authentication failed with SOCKS4 proxy'); | |
1330 | return 1; | |
1336 | push @{${*$self}->{SOCKS}->{queue}}, [ | |
1337 | '_socks4_accept_command_reply', [ REQUEST_REJECTED_USERID, '0.0.0.0', 0 ], undef, [], 0, | |
1338 | sub { | |
1339 | $! = ESOCKSPROTO; | |
1340 | $SOCKS_ERROR->set(REQUEST_REJECTED_USERID, $@ = 'Authentication failed with SOCKS4 proxy'); | |
1341 | } | |
1342 | ]; | |
1343 | ||
1344 | return 0; | |
1331 | 1345 | } |
1332 | 1346 | } |
1333 | 1347 |