Re: [Libevent-users] [PATCH] Fix problems in evport.c

2007-09-15 Thread Nick Mathewson
On Wed, Sep 12, 2007 at 10:23:52AM +0200, Trond Norbye wrote:
 This patch fix two problems with evport.c on Solaris:
 
 1. The grow-function reallocates the ed_fds array, but ed_pending array 
 may contain pointers to the elements in the ed_fds array. These pointers 
 must be relocated to avoid using freed memory.
 
 2. evport_dispatch does not handle a NULL-timval-pinter (no time-based 
 events are active, wait for I/O).

Thanks!  I've applied this to trunk and to the 1.3 branch.

yrs,
-- 
Nick Mathewson


pgpfSwvP7FH3h.pgp
Description: PGP signature
___
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users


[Libevent-users] [PATCH] Fix problems in evport.c

2007-09-12 Thread Trond Norbye

This patch fix two problems with evport.c on Solaris:

1. The grow-function reallocates the ed_fds array, but ed_pending array 
may contain pointers to the elements in the ed_fds array. These pointers 
must be relocated to avoid using freed memory.


2. evport_dispatch does not handle a NULL-timval-pinter (no time-based 
events are active, wait for I/O).


--Trond

Index: evport.c
===
--- evport.c	(revision 428)
+++ evport.c	(working copy)
@@ -240,8 +240,10 @@
 grow(struct evport_data *epdp, int factor)
 {
 	struct fd_info *tmp;
+	struct fd_info *old = epdp-ed_fds;
 	int oldsize = epdp-ed_nevents;
 	int newsize = factor * oldsize;
+	int ii;
 	assert(factor  1);
 
 	check_evportop(epdp);
@@ -252,6 +254,15 @@
 	epdp-ed_fds = tmp;
 	memset((char*) (epdp-ed_fds + oldsize), 0, 
 	(newsize - oldsize)*sizeof(struct fd_info));
+
+	/* The ev_pending array contains pointers into the released array. */
+	for (ii = 0; ii  EVENTS_PER_GETN; ++ii) {
+		if (epdp-ed_pending[ii] != 0) {
+			int offset = epdp-ed_pending[ii] - old;
+			epdp-ed_pending[ii] = epdp-ed_fds + offset;
+		}
+	}
+
 	epdp-ed_nevents = newsize;
 
 	check_evportop(epdp);
@@ -309,9 +320,16 @@
 
 	/*
 	 * We have to convert a struct timeval to a struct timespec
-	 * (only difference is nanoseconds vs. microseconds)
+	 * (only difference is nanoseconds vs. microseconds). If no time-based
+	 * events are active, we should wait for I/O (and tv == NULL).
 	 */
-	struct timespec ts = {tv-tv_sec, tv-tv_usec * 1000};
+	struct timespec ts;
+	struct timespec *ts_p = NULL;
+	if (tv != NULL) {
+		ts.tv_sec = tv-tv_sec;
+		ts.tv_nsec = tv-tv_usec * 1000;
+		ts_p = ts;
+	}
 
 	/*
 	 * Before doing anything else, we need to reassociate the events we hit
@@ -330,7 +348,7 @@
 	}
 
 	if ((res = port_getn(epdp-ed_port, pevtlist, EVENTS_PER_GETN, 
-		(unsigned int *) nevents, ts)) == -1) {
+		(unsigned int *) nevents, ts_p)) == -1) {
 		if (errno == EINTR) {
 			evsignal_process(base);
 			return (0);
___
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users