tdb: Protect against EINTR
authorVolker Lendecke <vl@samba.org>
Wed, 23 Aug 2017 10:00:00 +0000 (12:00 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 23 Aug 2017 23:46:08 +0000 (01:46 +0200)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/tdb/common/io.c

index fe47d18a5a4694ed365e11c9329afe14a4fda9e2..1b422affdca8d59a1d1ba51b369c57f073ba1701 100644 (file)
@@ -52,27 +52,48 @@ static bool tdb_adjust_offset(struct tdb_context *tdb, off_t *off)
 static ssize_t tdb_pwrite(struct tdb_context *tdb, const void *buf,
                          size_t count, off_t offset)
 {
+       ssize_t ret;
+
        if (!tdb_adjust_offset(tdb, &offset)) {
                return -1;
        }
-       return pwrite(tdb->fd, buf, count, offset);
+
+       do {
+               ret = pwrite(tdb->fd, buf, count, offset);
+       } while ((ret == -1) && (errno == EINTR));
+
+       return ret;
 }
 
 static ssize_t tdb_pread(struct tdb_context *tdb, void *buf,
                         size_t count, off_t offset)
 {
+       ssize_t ret;
+
        if (!tdb_adjust_offset(tdb, &offset)) {
                return -1;
        }
-       return pread(tdb->fd, buf, count, offset);
+
+       do {
+               ret = pread(tdb->fd, buf, count, offset);
+       } while ((ret == -1) && (errno == EINTR));
+
+       return ret;
 }
 
 static int tdb_ftruncate(struct tdb_context *tdb, off_t length)
 {
+       ssize_t ret;
+
        if (!tdb_adjust_offset(tdb, &length)) {
                return -1;
        }
-       return ftruncate(tdb->fd, length);
+
+       do {
+               ret = ftruncate(tdb->fd, length);
+       } while ((ret == -1) && (errno == EINTR));
+
+       return ret;
 }
 
 static int tdb_fstat(struct tdb_context *tdb, struct stat *buf)