[Skiboot] [PATCH 1/3] hdata: Add protection against corrupt ntuples structure

Stewart Smith stewart at linux.ibm.com
Mon Mar 18 16:52:17 AEDT 2019


Found using afl-lop on P9 HDAT. Pretty obvious what the problem is once
you look at it, and it's much better having a controlled failure mode
than just going off randomly into memory and segfaulting.

Signed-off-by: Stewart Smith <stewart at linux.ibm.com>
---
 hdata/spira.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/hdata/spira.c b/hdata/spira.c
index 5621870928ed..43c76f9755c4 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -215,9 +215,30 @@ struct HDIF_common_hdr *__get_hdif(struct spira_ntuple *n, const char id[],
 				   const char *file, int line)
 {
 	struct HDIF_common_hdr *h = ntuple_addr(n);
+	u16 act_cnt, alloc_cnt;
+	u32 act_len, alloc_len;
+
 	if (!spira_check_ptr(h, file, line))
 		return NULL;
 
+	act_cnt = be16_to_cpu(n->act_cnt);
+	alloc_cnt = be16_to_cpu(n->alloc_cnt);
+
+	if (act_cnt > alloc_cnt) {
+		prerror("SPIRA: bad ntuple, act_cnt > alloc_cnt (%u > %u)\n",
+			act_cnt, alloc_cnt);
+		return NULL;
+	}
+
+	act_len = be32_to_cpu(n->act_len);
+	alloc_len = be32_to_cpu(n->alloc_len);
+
+	if (act_len > alloc_len) {
+		prerror("SPIRA: bad ntuple, act_len > alloc_len (%u > %u)\n",
+			act_len, alloc_len);
+		return NULL;
+	}
+
 	if (!HDIF_check(h, id)) {
 		prerror("SPIRA: bad tuple %p: expected %s at %s line %d\n",
 			h, id, file, line);
-- 
2.20.1



More information about the Skiboot mailing list