[1130] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[D-O-H] r1082 - trunk/owl

daemon@ATHENA.MIT.EDU (asedeno@MIT.EDU)
Thu Oct 29 18:13:20 2009

Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
X-Original-To: nelhage@nelhage.com
To: dirty-owl-hackers@mit.edu
From: asedeno@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Mon, 16 Jun 2008 13:52:24 -0400 (EDT)

Author: asedeno
Date: 2008-06-16 13:52:24 -0400 (Mon, 16 Jun 2008)
New Revision: 1082

Modified:
   trunk/owl/ChangeLog
   trunk/owl/zephyr.c
Log:
Fix a segfault on retrieving zephyr subs when the user doesn't have any or has expired tickets.

Modified: trunk/owl/ChangeLog
===================================================================
--- trunk/owl/ChangeLog	2008-06-09 23:31:27 UTC (rev 1081)
+++ trunk/owl/ChangeLog	2008-06-16 17:52:24 UTC (rev 1082)
@@ -1,6 +1,8 @@
 $Id$
 
 1.0.2
+ * Fix a segfault on retrieving zephyr subs when the user doesn't
+   have any or has expired tickets. -asedeno
  * Don't complain about non-existant ~/.owl/startup when starting. -asedeno
 	
 1.0.1

Modified: trunk/owl/zephyr.c
===================================================================
--- trunk/owl/zephyr.c	2008-06-09 23:31:27 UTC (rev 1081)
+++ trunk/owl/zephyr.c	2008-06-16 17:52:24 UTC (rev 1082)
@@ -1007,34 +1007,50 @@
 {
 #ifdef HAVE_LIBZEPHYR
   int ret, num, i, one;
+  int buffsize;
   ZSubscription_t sub;
-  char *out, *tmpbuff;
+  char *out;
   one=1;
 
   ret=ZRetrieveSubscriptions(0, &num);
   if (ret==ZERR_TOOMANYSUBS) {
     return(owl_strdup("Zephyr: too many subscriptions\n"));
-  } else if (ret) {
+  } else if (ret || (num <= 0)) {
     return(owl_strdup("Zephyr: error retriving subscriptions\n"));
   }
 
-  out=owl_malloc(num*500);
-  tmpbuff=owl_malloc(num*500);
+  buffsize = (num + 1) * 50;
+  out=owl_malloc(buffsize);
   strcpy(out, "");
   for (i=0; i<num; i++) {
     if ((ret = ZGetSubscriptions(&sub, &one)) != ZERR_NONE) {
       owl_free(out);
-      owl_free(tmpbuff);
       ZFlushSubscriptions();
       out=owl_strdup("Error while getting subscriptions\n");
       return(out);
     } else {
-      sprintf(tmpbuff, "<%s,%s,%s>\n%s", sub.zsub_class, sub.zsub_classinst, sub.zsub_recipient, out);
+      int tmpbufflen;
+      char *tmpbuff;
+      tmpbuff = owl_sprintf("<%s,%s,%s>\n%s", sub.zsub_class, sub.zsub_classinst, sub.zsub_recipient, out);
+      tmpbufflen = strlen(tmpbuff) + 1;
+      if (tmpbufflen > buffsize) {
+        char *out2;
+        buffsize = tmpbufflen * 2;
+        out2 = owl_realloc(out, buffsize);
+        if (out2 == NULL) {
+          owl_free(out);
+          owl_free(tmpbuff);
+          ZFlushSubscriptions();
+          out=owl_strdup("Realloc error while getting subscriptions\n");
+          return(out);    
+        }
+        out = out2;
+      }
       strcpy(out, tmpbuff);
+      owl_free(tmpbuff);
     }
   }
 
-  owl_free(tmpbuff);
   ZFlushSubscriptions();
   return(out);
 #else


home help back first fref pref prev next nref lref last post