From 39d26ddac4dd652be65e429b62a9443ed3dfa823 Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Sat, 8 Feb 2020 15:22:20 +0100
Subject: [PATCH] fix segfault in pp_dict for 0-element dictionaries

the code would still try to print a last element.

also rearrange the loop to avoid code duplication and use delta-1
spaces after the comma.
---
 pdf.c | 30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/pdf.c b/pdf.c
index 859c460..f15bc6c 100644
--- a/pdf.c
+++ b/pdf.c
@@ -177,26 +177,20 @@ pp_dict(FILE *stream, const HParsedToken *tok, int indent, int delta)
 {
 	const HCountedArray *k_v;
 
-	if (tok->seq->used == 0)
+	if (tok->seq->used == 0) {
 		fprintf(stream, "{ }");
-	/* If there is more than one key-value pair, print all but
-	 * the last, followed by commas. */
-	else {
-		fprintf(stream, "{%*s", delta - 1, "");
-		for (size_t i = 0; i < tok->seq->used-1; i++) {
-			k_v = tok->seq->elements[i]->seq;
-			h_pprint(stream, k_v->elements[0], indent + delta, delta);
-			fprintf(stream, ":");
-			h_pprint(stream, k_v->elements[1], indent + delta, delta);
-			fprintf(stream, "\n%*s, ", indent, "");
-		}
+		return;
+	}
+
+	fprintf(stream, "{%*s", delta - 1, "");
+	for (size_t i = 0; i < tok->seq->used; i++) {
+		k_v = tok->seq->elements[i]->seq;
+		if (i > 0)
+			fprintf(stream, "\n%*s,%*s", indent, "", delta - 1, "");
+		h_pprint(stream, k_v->elements[0], indent + delta, delta);
+		fprintf(stream, ":");
+		h_pprint(stream, k_v->elements[1], indent + delta, delta);
 	}
-	
-	/* Special case: the last entry doesn't have a comma after it */
-	k_v = tok->seq->elements[(tok->seq->used)-1]->seq;
-	h_pprint(stream, k_v->elements[0], indent + delta, delta);
-	fprintf(stream, ":");
-	h_pprint(stream, k_v->elements[1], indent + delta, delta);
 
 	if (tok->seq->used > 2)
 		fprintf(stream, "\n%*s}", indent, "");
-- 
GitLab