diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c
index 985ad56da20e3817c8d495afd1b75880e8b1b8f0..a14215d6bde177847c005020431d7df809d7fbd4 100644
--- a/src/timezone/localtime.c
+++ b/src/timezone/localtime.c
@@ -536,9 +536,17 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
 int
 tzload(const char *name, char *canonname, struct state * sp, bool doextend)
 {
-	union local_storage ls;
+	union local_storage *lsp = malloc(sizeof *lsp);
 
-	return tzloadbody(name, canonname, sp, doextend, &ls);
+	if (!lsp)
+		return errno;
+	else
+	{
+		int			err = tzloadbody(name, canonname, sp, doextend, lsp);
+
+		free(lsp);
+		return err;
+	}
 }
 
 static bool