commit:     5574f98fd76030581c75622bcb7f2f2c85cad234
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Wed Nov 20 17:22:29 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Wed Nov 20 17:22:29 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=5574f98f

libq/xpak: fix out of bounds checking

Don't check bounds if there is no data retrieved, and make sure we check
the bounds on the data length, not index length.

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 libq/tree.c |  2 +-
 libq/xpak.c | 11 ++++++-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/libq/tree.c b/libq/tree.c
index 427281f..a383950 100644
--- a/libq/tree.c
+++ b/libq/tree.c
@@ -1094,7 +1094,7 @@ tree_foreach_packages(tree_ctx *ctx, tree_pkg_cb 
callback, void *priv)
 
                                cat->name = atom->CATEGORY;
                                pkg->name = atom->PN;
-                               pkg->slot = meta->SLOT == NULL ? "0" : 
meta->SLOT;
+                               pkg->slot = meta->SLOT == NULL ? (char *)"0" : 
meta->SLOT;
                                pkg->repo = ctx->repo;
                                pkg->atom = atom;
 

diff --git a/libq/xpak.c b/libq/xpak.c
index 71dc17e..90a3570 100644
--- a/libq/xpak.c
+++ b/libq/xpak.c
@@ -79,11 +79,12 @@ static void _xpak_walk_index(
                p += 4;
 
                /* check offset and len individually to deal with overflow */
-               if (data_offset > x->index_len ||
-                               data_len > x->index_len ||
-                               data_offset + data_len > x->index_len)
-                       err("Data for '%s' is out of bounds: offset=%u, 
len=%u\n",
-                                       pathname, data_len, data_offset);
+               if (x->data != NULL &&
+                               (data_offset > x->data_len ||
+                                data_len > x->data_len ||
+                                data_offset + data_len > x->data_len))
+                       err("Data for '%s' is out of bounds: offset=%u, len=%u, 
size=%u\n",
+                                       pathname, data_len, data_offset, 
x->data_len);
 
                (*func)(x->ctx, pathname, pathname_len,
                                data_offset, data_len, x->data);

Reply via email to