1a4ac9
From fecd3be8dbdb747b9cbf4cbb9299ce40faabc8e6 Mon Sep 17 00:00:00 2001
1a4ac9
From: John Lightsey <lightsey@debian.org>
1a4ac9
Date: Mon, 14 Nov 2016 11:56:15 +0100
1a4ac9
Subject: [PATCH] Fix Storable segfaults.
1a4ac9
1a4ac9
Fix a null pointed dereference segfault in storable when the
1a4ac9
retrieve_code logic was unable to read the string that contained
1a4ac9
the code.
1a4ac9
1a4ac9
Also fix several locations where retrieve_other was called with a
1a4ac9
null context pointer. This also resulted in a null pointer
1a4ac9
dereference.
1a4ac9
---
1a4ac9
 dist/Storable/Storable.xs | 10 +++++++---
1a4ac9
 1 file changed, 7 insertions(+), 3 deletions(-)
1a4ac9
1a4ac9
diff --git a/dist/Storable/Storable.xs b/dist/Storable/Storable.xs
1a4ac9
index 053951c..caa489c 100644
1a4ac9
--- a/dist/Storable/Storable.xs
1a4ac9
+++ b/dist/Storable/Storable.xs
1a4ac9
@@ -5647,6 +5647,10 @@ static SV *retrieve_code(pTHX_ stcxt_t *cxt, const char *cname)
1a4ac9
 		CROAK(("Unexpected type %d in retrieve_code\n", type));
1a4ac9
 	}
1a4ac9
 
1a4ac9
+	if (!text) {
1a4ac9
+		CROAK(("Unable to retrieve code\n"));
1a4ac9
+	}
1a4ac9
+
1a4ac9
 	/*
1a4ac9
 	 * prepend "sub " to the source
1a4ac9
 	 */
1a4ac9
@@ -5767,7 +5771,7 @@ static SV *old_retrieve_array(pTHX_ stcxt_t *cxt, const char *cname)
1a4ac9
 			continue;			/* av_extend() already filled us with undef */
1a4ac9
 		}
1a4ac9
 		if (c != SX_ITEM)
1a4ac9
-			(void) retrieve_other(aTHX_ (stcxt_t *) 0, 0);	/* Will croak out */
1a4ac9
+			(void) retrieve_other(aTHX_ cxt, 0);	/* Will croak out */
1a4ac9
 		TRACEME(("(#%d) item", i));
1a4ac9
 		sv = retrieve(aTHX_ cxt, 0);						/* Retrieve item */
1a4ac9
 		if (!sv)
1a4ac9
@@ -5844,7 +5848,7 @@ static SV *old_retrieve_hash(pTHX_ stcxt_t *cxt, const char *cname)
1a4ac9
 			if (!sv)
1a4ac9
 				return (SV *) 0;
1a4ac9
 		} else
1a4ac9
-			(void) retrieve_other(aTHX_ (stcxt_t *) 0, 0);	/* Will croak out */
1a4ac9
+			(void) retrieve_other(aTHX_ cxt, 0);	/* Will croak out */
1a4ac9
 
1a4ac9
 		/*
1a4ac9
 		 * Get key.
1a4ac9
@@ -5855,7 +5859,7 @@ static SV *old_retrieve_hash(pTHX_ stcxt_t *cxt, const char *cname)
1a4ac9
 
1a4ac9
 		GETMARK(c);
1a4ac9
 		if (c != SX_KEY)
1a4ac9
-			(void) retrieve_other(aTHX_ (stcxt_t *) 0, 0);	/* Will croak out */
1a4ac9
+			(void) retrieve_other(aTHX_ cxt, 0);	/* Will croak out */
1a4ac9
 		RLEN(size);						/* Get key size */
1a4ac9
 		KBUFCHK((STRLEN)size);					/* Grow hash key read pool if needed */
1a4ac9
 		if (size)
1a4ac9
-- 
1a4ac9
2.10.2
1a4ac9