From: Simon McVittie <smcv@debian.org>
Date: Sat, 30 Sep 2017 16:14:34 +0000 (+0100)
Subject: IkiWiki::Receive: Avoid using asprintf
X-Git-Tag: 3.20171001~7
X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/cf7df018ccf5513b79bcfe0b108e348b6da341c1

IkiWiki::Receive: Avoid using asprintf

On GNU/Linux, it isn't declared in stdio.h unless we define
_GNU_SOURCE, which we don't; using the implicit declaration risks
crashes on platforms where sizeof(pointer) != sizeof(int). On other
platforms it isn't guaranteed to exist at all.

Signed-off-by: Simon McVittie <smcv@debian.org>
---

diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
index 332ba7c2c..f985f560b 100644
--- a/IkiWiki/Receive.pm
+++ b/IkiWiki/Receive.pm
@@ -26,6 +26,8 @@ sub genwrapper () {
 	my $ret=<<"EOF";
 	{
 		int u=getuid();
+		/* 3 characters per byte is certainly enough */
+		char uid_string[sizeof(u) * 3 + 1];
 EOF
 	$ret.="\t\tif ( ".
 		join("&&", map {
@@ -46,8 +48,8 @@ EOF
 			while (read(0, &buf, 256) != 0) {}
 			exit(0);
 		}
-		asprintf(&s, "%i", u);
-		addenv("CALLER_UID", s);
+		snprintf(uid_string, sizeof(uid_string), "%i", u);
+		addenv("CALLER_UID", uid_string);
 	}
 EOF
 	return $ret;