From: Frank Kardel Date: Sat, 18 Aug 2007 12:53:35 +0000 (+0000) Subject: recvbuff.c: X-Git-Tag: NTP_4_2_4P4_RC1~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7fb9cdd3812fd1e74b45cb9879a3681df8df62fb;p=thirdparty%2Fntp.git recvbuff.c: Bug 889: avoid malloc() interrupted by SIGIO risk ChangeLog: document Bug 889 bk: 46c6ebcfXvaBIx96DeMP-ux8Rrrpcg --- diff --git a/ChangeLog b/ChangeLog index 11e1dde1c..d4452e400 100644 --- 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 diff --git a/libntp/recvbuff.c b/libntp/recvbuff.c index 39657daf0..9511c8fe5 100644 --- a/libntp/recvbuff.c +++ b/libntp/recvbuff.c @@ -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) {