From feecaba38bc334308c557f51c8b34a7e036d704b Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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 + + * 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 * 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