From: Andreas Ă–man Date: Sun, 12 Sep 2010 19:23:48 +0000 (+0000) Subject: Don't try to writev() longer vectors than sysconf(_SC_IOV_MAX) says X-Git-Tag: 2.12~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88c02ef4cf5a2b0fae6ded0775eee2e6f63ca490;p=thirdparty%2Ftvheadend.git Don't try to writev() longer vectors than sysconf(_SC_IOV_MAX) says --- diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 98aa27517..bf4e80835 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -38,10 +38,10 @@ int dvr_flags; int dvr_extra_time_pre; int dvr_extra_time_post; char *dvr_postproc; +int dvr_iov_max; static int de_tally; - struct dvr_entry_list dvrentries; static void dvr_entry_save(dvr_entry_t *de); @@ -721,6 +721,8 @@ dvr_init(void) struct stat st; uint32_t u32; + dvr_iov_max = sysconf(_SC_IOV_MAX); + /* Default settings */ dvr_retention_days = 31; diff --git a/src/dvr/mkmux.c b/src/dvr/mkmux.c index 3b2b5ca1d..d19dd489c 100644 --- a/src/dvr/mkmux.c +++ b/src/dvr/mkmux.c @@ -31,6 +31,8 @@ #include "mkmux.h" #include "ebml.h" +extern int dvr_iov_max; + TAILQ_HEAD(mk_cue_queue, mk_cue); #define MATROSKA_TIMESCALE 1000000 // in nS @@ -311,14 +313,20 @@ mk_write_to_fd(mk_mux_t *mkm, htsbuf_queue_t *hq) iov[i ].iov_base = hd->hd_data + hd->hd_data_off; iov[i++].iov_len = hd->hd_data_len - hd->hd_data_off; } - - if(writev(mkm->fd, iov, i) != hq->hq_size) { - mkm->error = errno; - tvhlog(LOG_ERR, "MKV", "%s: Unable to write -- %s", - mkm->filename, strerror(errno)); - } else { - mkm->fdpos += hq->hq_size; - } + + do { + ssize_t r; + int iovcnt = i < dvr_iov_max ? i : dvr_iov_max; + if((r = writev(mkm->fd, iov, iovcnt)) == -1) { + mkm->error = errno; + tvhlog(LOG_ERR, "MKV", "%s: Unable to write -- %s", + mkm->filename, strerror(errno)); + return; + } + mkm->fdpos += r; + i -= iovcnt; + iov += iovcnt; + } while(i); }