]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
recvbuff.c:
authorFrank Kardel <kardel@ntp.org>
Sat, 18 Aug 2007 12:53:35 +0000 (12:53 +0000)
committerFrank Kardel <kardel@ntp.org>
Sat, 18 Aug 2007 12:53:35 +0000 (12:53 +0000)
  Bug 889: avoid malloc() interrupted by SIGIO risk
ChangeLog:
  document Bug 889

bk: 46c6ebcfXvaBIx96DeMP-ux8Rrrpcg

ChangeLog
libntp/recvbuff.c

index 11e1dde1c8bbc8fa16bbdf3e9831dc69b2c877d7..d4452e400f64a832fe3482f0b5b1629670285d8a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* [Bug 889] avoid malloc() interrupted by SIGIO risk
 * ntpd/refclock_parse.c: cleanup shutdown while the file descriptor is still open.
 * [Bug 885] use emalloc() to get a message at the end of the memory
             unsigned types cannot be less than 0
index 39657daf0c9ba042eb1d8ef8eb65dea80b0228c2..9511c8fe50fce86ab33f9ccde13e0424fd8acfeb 100644 (file)
@@ -162,29 +162,13 @@ get_free_recv_buffer(void)
        recvbuf_t * buffer = NULL;
        LOCK();
        buffer = ISC_LIST_HEAD(free_recv_list);
-       if (buffer == NULL)
+       if (buffer != NULL)
        {
-               /*
-                * See if more are available
-                */
-               if (create_buffers(RECV_INC) <= 0)
-               {
-                       msyslog(LOG_ERR, "No more memory for recvufs");
-                       UNLOCK();
-                       return (NULL);
-               }
-               buffer = ISC_LIST_HEAD(free_recv_list);
-               if (buffer == NULL)
-               {
-                       msyslog(LOG_ERR, "Failed to obtain more memory for recvbufs");
-                       UNLOCK();
-                       return (NULL);
-               }
+               ISC_LIST_DEQUEUE(free_recv_list, buffer, link);
+               free_recvbufs--;
+               initialise_buffer(buffer);
+               (buffer->used)++;
        }
-       ISC_LIST_DEQUEUE(free_recv_list, buffer, link);
-       free_recvbufs--;
-       initialise_buffer(buffer);
-       (buffer->used)++;
        UNLOCK();
        return (buffer);
 }
@@ -194,6 +178,29 @@ get_full_recv_buffer(void)
 {
        recvbuf_t *rbuf;
        LOCK();
+       
+       /*
+        * make sure there are free buffers when we
+        * wander off to do lengthy paket processing with
+        * any buffer we grab from the full list.
+        * 
+        * fixes malloc() interrupted by SIGIO risk
+        * (Bug 889)
+        */
+       rbuf = ISC_LIST_HEAD(free_recv_list);
+       if (rbuf == NULL) {
+               /*
+                * try to get us some more buffers
+                */
+               if (create_buffers(RECV_INC) <= 0)
+               {
+                       msyslog(LOG_ERR, "No more memory for recvufs");
+               }
+       }
+
+       /*
+        * try to grab a full buffer
+        */
        rbuf = ISC_LIST_HEAD(full_recv_list);
        if (rbuf != NULL)
        {