[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[coldsync-hackers] [patch] broken conduits exhaust resources



I discovered a couple of bugs with a seriously broken sync conduit.

First, a broken sync conduit that does an dlp_OpenDB without closing will 
lock out all other SPC-capable sync conduits.

Second, too many SPC-capable sync conduits will exhaust file descriptors 
because the SPC pipes (from socketpair) are never closed.

Attached is a patch for both problems and a sample conduit, syncjerk, that 
shows the bug. If you configure syncjerk to sync a specific database (i.e. 
type: mail/DATA) it'll exhaust dlp handles. If you configure it with 
type:*/* (or any other SPC conduit, actually), it'll (eventually) exhaust 
both file descriptors and dlp handles.

c.
Index: coldsync/src/conduit.c
===================================================================
RCS file: /var/lib/cvs/coldsync/src/conduit.c,v
retrieving revision 2.64
diff -u -r2.64 conduit.c
--- coldsync/src/conduit.c	10 Dec 2002 12:04:04 -0000	2.64
+++ coldsync/src/conduit.c	11 Jun 2003 22:53:13 -0000
@@ -1109,6 +1109,20 @@
 		fclose(fromchild);
 	}
 
+	if( with_spc ) {
+	   /* A Palm doesn't allow all that many open databases
+	   at once. If a conduit terminates with a database open
+	   (prematurely or otherwise) it can lock out any other conduits
+	   that do DlpOpenDB calls. Since this includes essentially _all_
+	   sync conduits, we want to prevent it by just closing all the
+	   databases. */
+
+	   DlpCloseDB( palm_pconn(palm), DLPCMD_CLOSEALLDBS, 0 );
+
+		close( spcpipe[0] );
+		close( spcpipe[1] );
+  	}
+
 	/* Let's not hog memory */
 	if (pref_list != NULL)
 		free(pref_list);

Attachment: syncjerk
Description: Perl program