From feecaba38bc334308c557f51c8b34a7e036d704b Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 7 Jan 2018 17:34:28 +0100
Subject: Fixed a bug when reading the compressed database.

---
 ChangeLog             |  9 +++++++++
 src/analysis/db/cdb.c |  4 ++--
 src/common/io.c       | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/common/io.h       |  3 +++
 4 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 63cedf9..6ba737d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+18-01-07  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/analysis/db/cdb.c:
+	Fix a bug when reading the compressed database.
+
+	* src/common/io.c:
+	* src/common/io.h:
+	Introduce partial readings.
+
 17-12-31  Cyrille Bagard <nocbos@gmail.com>
 
 	* plugins/ropgadgets/select.c:
diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c
index 78f2aa8..3199308 100644
--- a/src/analysis/db/cdb.c
+++ b/src/analysis/db/cdb.c
@@ -539,9 +539,9 @@ DBError g_cdb_archive_write(const GCdbArchive *archive)
             goto afta_error;
         }
 
-        for (len = safe_read(fd, buffer, ARCHIVE_RBUF_SIZE);
+        for (len = safe_read_partial(fd, buffer, ARCHIVE_RBUF_SIZE);
              len > 0;
-             len = safe_read(fd, buffer, ARCHIVE_RBUF_SIZE))
+             len = safe_read_partial(fd, buffer, ARCHIVE_RBUF_SIZE))
         {
             if (archive_write_data(out, buffer, len) != len)
                 goto afta_error;
diff --git a/src/common/io.c b/src/common/io.c
index 68659fb..f7d3e4c 100644
--- a/src/common/io.c
+++ b/src/common/io.c
@@ -87,6 +87,61 @@ bool safe_read(int fd, const void *buf, size_t count)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : fd  = flux ouvert en lecture.                                *
+*                buf = données à recevoir.                                    *
+*                max = quantité maximale de ces données.                      *
+*                                                                             *
+*  Description : Lit des données depuis un flux local.                        *
+*                                                                             *
+*  Retour      : Nombre d'octets lus, au pire 0 en cas d'erreur.              *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+ssize_t safe_read_partial(int fd, const void *buf, size_t max)
+{
+    ssize_t result;                         /* Quantité lue à remonter     */
+    uint8_t *iter;                          /* Données en attente          */
+    size_t remaining;                       /* Quantité restante           */
+    ssize_t got;                            /* Données envoyées            */
+
+    result = 0;
+
+    iter = (uint8_t *)buf;
+    remaining = max;
+
+    while (remaining > 0)
+    {
+        got = read(fd, iter, remaining);
+
+        if (got == -1)
+        {
+            if (errno == EINTR) continue;
+            else
+            {
+                perror("read");
+                break;
+            }
+        }
+
+        if (got == 0)
+            break;
+
+        result += got;
+
+        iter += got;
+        remaining -= got;
+
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : fd    = flux ouvert en écriture.                             *
 *                buf   = données à émettre.                                   *
 *                count = quantité de ces données.                             *
diff --git a/src/common/io.h b/src/common/io.h
index e0316f7..35acd10 100644
--- a/src/common/io.h
+++ b/src/common/io.h
@@ -34,6 +34,9 @@
 /* Lit des données depuis un flux local. */
 bool safe_read(int, const void *, size_t);
 
+/* Lit des données depuis un flux local. */
+ssize_t safe_read_partial(int, const void *, size_t);
+
 /* Ecrit des données dans un flux local. */
 bool safe_write(int, const void *, size_t);
 
-- 
cgit v0.11.2-87-g4458