You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
now wait for the ACK to finally be connected
- If we sent a SYN_ACK to this peer before */
- if ( (GNUNET_TRANSPORT_PS_SYN_RECV_ACK != n->state) &&
- (ACK_SEND_ACK != n->ack_state))
+ if ( ( (GNUNET_TRANSPORT_PS_SYN_RECV_ACK != n->state) &&
+ (ACK_SEND_ACK != n->ack_state) ) ||
+ (NULL == n->primary_address.address) )
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Received unexpected ACK message from peer `%s' in state %s/%s\n",
GNUNET_TRANSPORT_PS_CONNECTED,
GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT));
+ if (NULL == n->primary_address.address) {
+ /* See issue #3693.
+ * We are in state = PSY_SYN_RECV_ACK or ack_state = ACK_SEND_ACK, which
+ * really means we did try (and succeed) to send a SYN and are waiting for
+ * an ACK.
+ * That suggests that the primary_address used to be non-NULL, but maybe it
+ * got reset to NULL without the state being changed appropriately?
+ */
+ GNUNET_break (0);
+ return GNUNET_OK;
+ }
+
/* Reset backoff for primary address */
GST_ats_block_reset (n->primary_address.address,
n->primary_address.session);
GNUNET_break_op (0);
return;
}
- n->delayed_disconnect_task = GNUNET_SCHEDULER_add_now (&delayed_disconnect, n);
+ if (NULL == n->delayed_disconnect_task)
+ {
+ n->delayed_disconnect_task = GNUNET_SCHEDULER_add_now (&delayed_disconnect,
+ n);
+ }
}