summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1135-0001-sigsegv-in-txw.patch
blob: af6d4fdc2e5d6c655d38f8ce527054a416df8d41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Problem: OpenPGM generates a SIGSEGV upon accessing peer->sock->use_pgmcc.
	 This is because the code assumes that the queue list entry comes first
	 in the definition of struct pgm_peer_t, which it does not (anymore?).

diff -Naur openpgm-r1135-pristine/pgm/receiver.c openpgm-svn-r1135/pgm/receiver.c
--- openpgm-r1135-pristine/pgm/receiver.c	2010-09-06 20:41:52.000000000 +0200
+++ openpgm-svn-r1135/pgm/receiver.c	2010-09-24 12:40:07.000000000 +0200
@@ -71,7 +71,9 @@
 	pgm_assert (NULL != window);
 	pgm_assert (NULL != window->ack_backoff_queue.tail);
 
-	const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail;
+	const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail->data;
+	pgm_assert (NULL != peer);
+
 	pgm_assert (peer->sock->use_pgmcc);
 	return peer->ack_rb_expiry;
 }
@@ -416,6 +418,9 @@
 					sock->ack_c_p);
 	peer->spmr_expiry = now + sock->spmr_expiry;
 
+/* Prepare ack_link */
+	peer->ack_link.data = peer;
+
 /* add peer to hash table and linked list */
 	pgm_rwlock_writer_lock (&sock->peers_lock);
 	pgm_peer_t* entry = _pgm_peer_ref (peer);