potential bug in David Brownell's zcip code

Michael Schmidt <[email protected]> Wed, 22 Dec 2004 15:39:12 +0100
Newsgroups gmane.network.zeroconf.workers
Organization University of Siegen
Message-ID <[email protected]>
--Boundary-00=_QcYyBUr8+X8FPU6
Content-Type: multipart/signed;
  boundary="nextPart5337519.frD07uXYOW";
  protocol="application/pgp-signature";
  micalg=pgp-sha1
Content-Transfer-Encoding: 7bit

--nextPart5337519.frD07uXYOW
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: base64
Content-Disposition: inline

SGksCgpOb3cgdGhhdCBJJ20gc2VlaW5nIGEgYml0IGNsZWFyZXIgYWJvdXQgdGhlIGxlZ2FsIHN0
YXR1cyBvZiBEYXZpZCBCcm93bmVsbCdzIAp6Y2lwIGNvZGUsIEknZCBsaWtlIHRvIGRpc2N1c3Mg
YSBwb3RlbnRpYWwgYnVnIEkgaGF2ZSBkaXNjb3ZlcmVkIHJlY2VudGx5LiAKVGhlIGJ1ZyBpcyBh
Ym91dCB0aW1lIG1lYXN1cmVtZW50IGFuZCB0aW1lL3RpbWVvdXQgY2FsY3VsYXRpb24gYW5kIApy
ZWNhbGN1bGF0aW9uIGFyb3VuZCB0aGUgY2FsbCB0byAncG9sbCgpJy4gCgpCdXQgZmlyc3QsIGxl
dCBtZSBleHBsYWluIGhvdyBJIHVuZGVyc3RhbmQgY2VydGFpbiBwYXJ0cyBvZiB0aGUgY29kZToK
CjEuIG1lYW5pbmcgb2YgJ3R2MSc6CgqgoKCgoKCgoGlmICh0aW1lb3V0ID4gMCkgewqgoKCgoKCg
oKCgoKCgoKCgZ2V0dGltZW9mZGF5KCZ0djEsIE5VTEwpOwqgoKCgoKCgoKCgoKCgoKCgdHYxLnR2
X3VzZWMgKz0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CqCgoKCgoKCgoKCgoKCgoKBpZiAodHYx
LnR2X3VzZWMgPiAxMDAwMDAwKSB7CqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoHR2MS50dl91c2Vj
IC09IDEwMDAwMDA7CqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoHR2MS50dl9zZWMrKzsKoKCgoKCg
oKCgoKCgoKCgoH0KoKCgoKCgoKCgoKCgoKCgoHR2MS50dl9zZWMgKz0gdGltZW91dCAvIDEwMDA7
CqCgoKCgoKCgfSBlbHNlIGlmICh0aW1lb3V0ID09IDApIHsKoKCgoKCgoKCgoKCgoKCgoHRpbWVv
dXQgPSBtc19yZGVsYXkoUFJPQkVfV0FJVCk7CgondHYxJyBzZWVtcyB0byBiZSB0aGUgdGltZW91
dCBmb3IgdGhlIHN1YnNlcXVlbnQgY2FsbCB0byAncG9sbCgpJyBhcyAKImFic29sdXRlIiB0aW1l
IHZhbHVlIGZvciBmaW5pdGUsIG5vbi16ZXJvIHRpbWVvdXRzLgoKCjIuIGludGVycHJldGF0aW9u
IG9mICdwb2xsKCknIHJldHVybiBjb2RlczoKCqCgoKCgoKCgc3dpdGNoIChwb2xsKGZkcywgMSwg
dGltZW91dCkpIHsKCqCgoKCgoKCgLy8gdGltZW91dHMgdHJpZ2dlciBwcm90b2NvbCB0cmFuc2l0
aW9ucwqgoKCgoKCgoGNhc2UgMDoKoKCgoKCgoKAuCqCgoKCgoKCgLqCgoKCgoKCgoKCgoKCgoC8q
IHRoaXMgaXMgdGhlICd0aW1lb3V0JyBicmFuY2ggKi8KoKCgoKCgoKAuCqCgoKCgoKCgYnJlYWs7
CgqgoKCgoKCgoC8vIHBhY2tldHMgYXJyaXZpbmcKoKCgoKCgoKBjYXNlIDE6CqCgoKCgoKCgLgqg
oKCgoKCgoC6goKCgoKCgoKCgoKCgoKAvKiB0aGlzIGlzIHRoZSAncGFja2V0IGhhcyBhcnJpdmVk
JyBicmFuY2ggKi8KoKCgoKCgoKAuCqCgoKCgoKCgYnJlYWs7CgqgoKCgoKCgoGRlZmF1bHQ6CqCg
oKCgoKCgLgqgoKCgoKCgoC6goKCgoKCgoKCgoKCgoKAvKiB0aGlzIGlzIHRoZSAnZXJyb3InIGJy
YW5jaCAqLwqgoKCgoKCgoC4KCgozLiByZWNhbGN1bGF0aW9uIG9mIHRpbWVvdXQgaW4gJ3BhY2tl
dCBoYXMgYXJyaXZlZCcgYnJhbmNoOgoKoKCgoKCgoKCgoKCgoKCgoC8vIG1heWJlIGFkanVzdCB0
aW1lb3V0CqCgoKCgoKCgoKCgoKCgoKBpZiAodGltZW91dCA+IDApIHsKoKCgoKCgoKCgoKCgoKCg
oKCgoKCgoKCgc3RydWN0IHRpbWV2YWwgdHYyOwoKoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgZ2V0
dGltZW9mZGF5KCZ0djIsIE5VTEwpOwqgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBpZiAodGltZXJj
bXAoJnR2MSwgJnR2MiwgPCkpIHsKoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKB0aW1l
b3V0ID0gLTE7CqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoH0gZWxzZSB7CqCgoKCgoKCgoKCgoKCg
oKCgoKCgoKCgoKCgoKCgoKCgdGltZXJzdWIoJnR2MSwgJnR2MiwgJnR2MSk7CqCgoKCgoKCgoKCg
oKCgoKCgoKCgoKCgoKCgoKCgoKCgdGltZW91dCA9IDEwMDAgKiB0djEudHZfc2VjCqCgoKCgoKCg
oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCsgdHYxLnR2X3VzZWMgLyAx
MDAwOwqgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKB9CqCgoKCgoKCgoKCgoKCgoKB9CgondHYyJyBp
cyB0aGUgdGltZSB3aGVuIHRoZSBwcm90b2NvbCBoYXMgcmV0dXJuZWQgZnJvbSAncG9sbCgpJy4g
QXBwYXJlbnRseSwgCnRoZSBjb2RlIGNhbGN1bGF0ZXMgdGhlIHRpbWUgZGlmZmVyZW5jZSBiZXR3
ZWVuIHRoZSBleHBlY3RlZCwgYWJzb2x1dGUgZXhwaXJ5IAp0aW1lICgndHYxJykgYW5kIHRoZSBj
dXJyZW50IHRpbWUgKCd0djInKS4gSWYgdGhlIGN1cnJlbnQgdGltZSBpcyBncmVhdGVyLCAKdGhl
IGNvZGUgc2VlbXMgdG8gYXNzdW1lIHRoYXQgdGhlIHRpbWVvdXQgaGFzIGVsYXBzZWQuIEluIHRo
aXMgY2FzZSwgdGhlIGNvZGUgCmFsc28gYXNzdW1lcyB0aGF0IHRoZSBwcm90b2NvbCBuZWdvdGlh
dGlvbiBwaGFzZSAoUFJPQkUvQU5OT1VOQ0UpIGlzIG92ZXIsIAphbmQgaXQgbWF5IGdvIGludG8g
YW4gaW5maW50ZSB3YWl0IHN0YXRlIHdoZXJlIGl0IHdvdWxkIG9ubHkgZGVmZW5kIHRoZSAKc3Vj
Y2Vzc2Z1bGx5IGFjcXVpcmVkIElQIGFkZHJlc3MgaWYgbmVjZXNzYXJ5LiAKClRoZXJlIGFyZSB0
d28gcHJvYmxlbXMgd2l0aCB0aGlzOgoKYSkKV2hlbiB0aGUgY29kZSBpcyBpbiB0aGUgJ3BhY2tl
dCBoYXMgYXJyaXZlZCcgYnJhbmNoLCB0aGUgdGltZW91dCBjYW5ub3QgaGF2ZSAKZWxhcHNlZCBi
eSBkZWZpbml0aW9uIG9mICdwb2xsKCknLiBFeGNlZWRpbmcgb2YgdGhlIHRpbWVvdXQgbGVhZHMg
aW50byAKdGhlICd0aW1lb3V0JyBicmFuY2guCgpiKQpUaGlzIGNvZGUgbWF5IGVycm9uZW91c2x5
IGFzc3VtZSB0aGF0IHRoZSB0aW1lb3V0IGhhcyBlbGFwc2VkLCBpZiBhbiAKdW5leHBlY3RlZCBB
UlAgcGFja2V0IGFycml2ZXMgd2l0aGluIHRoZSByZWd1bGFyLCBmaW5pdGUgdGltZW91dCAoc3Rp
bGwgaW4gCnRoZSBwcm90b2NvbCBuZWdvdGlhdGlvbiBwaGFzZSksIGFuZCB0aGUgT1MgcHJlZW1w
dHMgdGhlIHpjaXAgY29kZSBiZXR3ZWVuIAp0aGUgcmV0dXJuIG9mICdwb2xsKCknIGFuZCB0aGUg
dGltZW91dCByZWNhbGN1bGF0aW9uIGFib3ZlLiBXaGVuIHRoZSBjb2RlIGlzIApyZWFjdGl2YXRl
ZCBieSB0aGUgc2NoZWR1bGVyLCB0aGUgdGltZW91dCBtYXkgaW5kZWVkIGhhdmUgZWxhcHNlZCwg
YW5kIAondGltZXJjbXAoJnR2MSwgJnR2MiwgPCknIHdpbGwgaG9sZCB0cnVlLiBJbiB0aGlzIGNh
c2UsIHRoZSBjb2RlIHdpbGwgCmVycm9uZW91c2x5IGFzc3VtZSB0aGF0IHRoZSBwcm90b2NvbCBu
ZWdvdGlhdGlvbiBwaGFzZSBpcyBmaW5pc2hlZCwgYW5kIHdpbGwgCnNldCB0aGUgc3Vic2VxdWVu
dCB0aW1lb3V0IHRvIC0xIChpbmZpbml0ZSkuIHpjaXAgd2lsbCBzZWVtIHRvIGhhbmcuCgoKSSBj
YW4gcmVwcm9kdWNlIHRoaXMgcHJvYmxlbSBoZXJlIG1vcmUgb3IgbGVzcyBjb25zaXN0ZW50bHkg
YnkgZXhlY3V0aW5nIHpjaXAgCm9uIG1vcmUgdGhhbiBvbmUgbm9kZSBjb25jdXJyZW50bHksIHNv
IHRoYXQgInVuZXhwZWN0ZWQiIEFSUCByZXF1ZXN0IHBhY2tldHMgCmFyZSByZWNlaXZlZCB3aXRo
aW4gdGhlIHByb3RvY29sIG5lZ290aWF0aW9uIHBoYXNlLgoKCkkgaGF2ZSBmaXhlZCB0aGUgcHJv
YmxlbSBieSByZXBsYWNpbmcgJ3BvbGwoKScgd2l0aCAnc2VsZWN0KCknIGFuZCBieSAKc2ltcGxp
ZnlpbmcgdGhlIHRpbWVvdXQgcmVjYWxjdWxhdGlvbiAod2hpY2ggaXMgYW4gb2J2aW91cyBjb25z
ZXF1ZW5jZSBvZiAKdXNpbmcgJ3NlbGVjdCgpJy4gJ3NlbGVjdCgpJyByZXR1cm5zIHdpdGggdGhl
IHRpbWVvdXQgcGFyYW1ldGVyIGNvbnRhaW5pbmcgCnRoZSByZW1haW5pbmcgdGltZW91dCB2YWx1
ZSB3aGVuIGl0IGlzIHdva2VuIHVwIGJ5IGEgcGFja2V0IGJlZm9yZSB0aGUgCnRpbWVvdXQgaGFz
IGVsYXBzZWQuIFRoaXMgdmFsdWUgY2FuIGRpcmVjdGx5IGJlIHVzZWQgZm9yIHJlLWludm9raW5n
IAonc2VsZWN0KCknLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgYmVoYXZpb3IgaXMgb25seSBpbXBs
ZW1lbnRlZCBpbiBMaW51eCwgYnV0IApub3QgaW4gb3RoZXIgVW5pY2VzLCBzbyB0aGF0IG15IHBh
dGNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3RoZXIgVW5pY2VzLgoKTXkgcGF0Y2gsIHdoaWNo
IGFwcGxpZXMgdG8gRGF2aWQgQnJvd25lbGwncyBpbml0aWFsIGNvZGUgcG9zdGluZyBvbiAKemVy
b2NvbmYtd29ya2VycyBmcm9tIDI2LzEwLzA0LCBpcyBhdHRhY2hlZC4KCgpBbnkgY29tbWVudHM/
Pz8KCgpNaWNoYWVsCgoKLS0gCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ck1pY2hhZWwgU2NobWlkdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQpJbnN0aXR1dGUgZm9yIERpZ2l0YWwgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcwpV
bml2ZXJzaXR5IG9mIFNpZWdlbiwgR2VybWFueQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQpodHRwOiAgIHd3dy5kY3MudW5pLXNpZWdlbi5kZQplLW1haWw6IHNj
aG1pZHRAbnVlLmV0LWluZi51bmktc2llZ2VuLmRlCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Cgo=

--nextPart5337519.frD07uXYOW
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD8DBQBByYcQQxcxBvLsRaoRAgGyAJ9uR7g+56QjEK24g+OfbR4n9fPXsQCgqa6U
clpOk/g7i9oITEaHALkJ074=
=1UZo
-----END PGP SIGNATURE-----

--nextPart5337519.frD07uXYOW--

--Boundary-00=_QcYyBUr8+X8FPU6
Content-Type: text/x-diff;
  charset="iso-8859-1";
  name="zcip.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="zcip.patch"

--- zcip.c.orig	2004-12-20 17:09:12.000000000 +0100
+++ zcip.c	2004-12-22 10:29:02.717064544 +0100
@@ -369,28 +369,28 @@
 	//  - use it
 	//  - defend it, within limits
 	while (1) {
-		struct pollfd fds[1];
-		struct timeval tv1;
+		fd_set rfds, efds;
+		struct timeval to, *pto;
 
-		fds[0].fd = fd;
-		fds[0].events = POLLIN | POLLERR;
-		fds[0].revents = 0;
+		FD_ZERO(&rfds);
+		FD_SET(fd, &rfds);
+		FD_ZERO(&efds);
+		FD_SET(fd, &efds);
 
 		// poll, being ready to adjust current timeout 
-		if (timeout > 0) {
-			gettimeofday(&tv1, NULL);
-			tv1.tv_usec += (timeout % 1000) * 1000;
-			if (tv1.tv_usec > 1000000) {
-				tv1.tv_usec -= 1000000;
-				tv1.tv_sec++;
-			}
-			tv1.tv_sec += timeout / 1000;
-		} else if (timeout == 0) {
+		if (timeout == 0) {
 			timeout = ms_rdelay(PROBE_WAIT);
 		}
 		VDBG("...wait %ld %s nprobes=%d, nclaims=%d\n",
 				timeout, intf, nprobes, nclaims);
-		switch (poll(fds, 1, timeout)) {
+		if (timeout == -1)
+			pto = NULL;
+		else {
+			to.tv_sec = timeout / 1000;
+			to.tv_usec = (timeout % 1000) * 1000;
+			pto = &to;
+		}
+		switch (select(fd + 1, &rfds, NULL, &efds, pto)) {
 
 		// timeouts trigger protocol transitions
 		case 0:
@@ -437,19 +437,10 @@
 		case 1:
 			// maybe adjust timeout
 			if (timeout > 0) {
-				struct timeval tv2;
-
-				gettimeofday(&tv2, NULL);
-				if (timercmp(&tv1, &tv2, <)) {
-					timeout = -1;
-				} else {
-					timersub(&tv1, &tv2, &tv1);
-					timeout = 1000 * tv1.tv_sec
-							+ tv1.tv_usec / 1000;
-				}
+				timeout = to.tv_sec * 1000 + to.tv_usec / 1000;
 			}
-			if ((fds[0].revents & POLLIN) == 0) {
-				if (fds[0].revents & POLLERR) {
+			if (FD_ISSET(fd, &rfds) == 0) {
+				if (FD_ISSET(fd, &efds) != 0) {
 					// FIXME: links routinely go down;
 					// this shouldn't necessarily exit.
 					fprintf(stderr, "%s %s: poll error\n",

--Boundary-00=_QcYyBUr8+X8FPU6--


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/