Date: Wednesday, December 25, 2013 @ 10:36:26
  Author: bgyorgy
Revision: 102974

upgpkg: trickle 1.07-8

Fix crasher (FS#35872)

Added:
  trickle/trunk/fix-crasher.patch
Modified:
  trickle/trunk/PKGBUILD

-------------------+
 PKGBUILD          |   19 ++++++++---
 fix-crasher.patch |   86 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 100 insertions(+), 5 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2013-12-25 08:45:14 UTC (rev 102973)
+++ PKGBUILD    2013-12-25 09:36:26 UTC (rev 102974)
@@ -4,21 +4,30 @@
 
 pkgname=trickle
 pkgver=1.07
-pkgrel=7
+pkgrel=8
 pkgdesc="Lightweight userspace bandwidth shaper"
 arch=('i686' 'x86_64')
 url="http://monkey.org/~marius/trickle";
 license=('BSD')
 depends=('libevent')
-source=("http://monkey.org/~marius/trickle/${pkgname}-${pkgver}.tar.gz";)
-md5sums=('860ebc4abbbd82957c20a28bd9390d7d')
+source=("http://monkey.org/~marius/trickle/${pkgname}-${pkgver}.tar.gz";
+        "fix-crasher.patch")
+md5sums=('860ebc4abbbd82957c20a28bd9390d7d'
+         'a072091bce131e9f7229bff85ed5858c')
 
-build() {
+prepare() {
   cd "${srcdir}/${pkgname}-${pkgver}"
   
-  # FS#23194
+  # FS#27549
   sed -i 's|^_select(int|select(int|' trickle-overload.c
 
+  # FS#35872
+  patch -Np1 -i "${srcdir}/fix-crasher.patch"
+}
+
+build() {
+  cd "${srcdir}/${pkgname}-${pkgver}"
+  
   ./configure --prefix=/usr \
               --mandir=/usr/share/man
   sed -i "s|.*in_addr_t.*||g" config.h

Added: fix-crasher.patch
===================================================================
--- fix-crasher.patch                           (rev 0)
+++ fix-crasher.patch   2013-12-25 09:36:26 UTC (rev 102974)
@@ -0,0 +1,86 @@
+diff --git a/trickle-overload.c b/trickle-overload.c
+index e72eb0c..9254e89 100644
+--- a/trickle-overload.c
++++ b/trickle-overload.c
+@@ -393,18 +393,14 @@ struct _pollfd {
+ }
+ 
+ static struct delay *
+-select_shift(struct delayhead *dhead, struct timeval *inittv,
++select_shift(struct delayhead *dhead, struct timeval *difftv,
+     struct timeval **delaytv)
+ {
+-      struct timeval curtv, difftv;
+       struct delay *d;
+       struct sockdesc *sd;
+ 
+-      gettimeofday(&curtv, NULL);
+-      timersub(&curtv, inittv, &difftv);
+-
+       TAILQ_FOREACH(d, dhead, next) {
+-              if (timercmp(&d->delaytv, &difftv, >))
++              if (timercmp(&d->delaytv, difftv, >))
+                       break;
+               sd = d->sd;
+ 
+@@ -413,7 +409,7 @@ struct _pollfd {
+       }
+ 
+       if (d != NULL)
+-              timersub(&d->delaytv, &difftv, *delaytv);
++              timersub(&d->delaytv, difftv, *delaytv);
+       else 
+               *delaytv = NULL;
+ 
+@@ -431,8 +427,8 @@ struct _pollfd {
+ {
+       struct sockdesc *sd;
+       fd_set *fdsets[] = { wfds, rfds }, *fds;
+-      struct timeval *delaytv, *selecttv = NULL, *timeout = NULL, _timeout,
+-          inittv, curtv, difftv;
++      struct timeval *delaytv, _delaytv, *selecttv = NULL, *timeout = NULL,
++          _timeout, inittv, curtv, difftv;
+       short which;
+       struct delayhead dhead;
+       struct delay *d, *_d;
+@@ -462,15 +458,18 @@ struct _pollfd {
+                           FD_ISSET(sd->sock, fds) &&
+                           select_delay(&dhead, sd, which)) {
+                               FD_CLR(sd->sock, fds);
+-                              nfds--;
+                       }
+ 
+       gettimeofday(&inittv, NULL);
+       curtv = inittv;
+       d = TAILQ_FIRST(&dhead);
+-      delaytv = d != NULL ? &d->delaytv : NULL;
++      if (d != NULL) {
++              _delaytv = d->delaytv;
++              delaytv = &_delaytv;
++      } else
++              delaytv = NULL;
++      timersub(&curtv, &inittv, &difftv);
+  again:
+-      timersub(&inittv, &curtv, &difftv);
+       selecttv = NULL;
+ 
+       if (delaytv != NULL)
+@@ -498,15 +497,15 @@ struct _pollfd {
+ #endif /* DEBUG */
+ 
+       if (ret == 0 && delaytv != NULL && selecttv == delaytv) {
+-              _d = select_shift(&dhead, &inittv, &delaytv);
++              gettimeofday(&curtv, NULL);
++              timersub(&curtv, &inittv, &difftv);
++              _d = select_shift(&dhead, &difftv, &delaytv);
+               while ((d = TAILQ_FIRST(&dhead)) != _d) {
+                       FD_SET(d->sd->sock, fdsets[d->which]);
+-                      nfds++;
+                       TAILQ_REMOVE(&dhead, d, next);
+                       free(d);
+               }
+ 
+-              gettimeofday(&curtv, NULL);
+               goto again;
+       }
+ 

Reply via email to