From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-we0-f180.google.com (mail-we0-f180.google.com [74.125.82.180]); by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id 6b4de512; for ; Fri, 20 Mar 2015 09:36:55 -0500 (EST) Received: by wetk59 with SMTP id k59so83697625wet.3 for ; Fri, 20 Mar 2015 07:36:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:user-agent:mime-version :content-type; bh=vyKOEVrn7hbeGOjpsZeBH4dbrQSiEl9Mu5rPZJ8mTf4=; b=wGQk4xFzycY8Lwc7bm7VY1eE1wgSC6oJF10ul9BQ9CnsZ1RAzDSl7o41hOHNj01jm7 Vw543JrszHLVeNvmOVp51brZZE+rtH1AfpHNFnPLbLxwyJwpQqGef2/0JS5quhUCe627 fgLd70BiSuh68YxCDe8i+uJj9kjRb2FG6gAJa7TQY/OOQRY4RZKqZCQKrZU4vNtrk4xj wh9ZrqK7dBmP6G1V4gvHxhZskZFfeAkF4SmokLKTcagUKe0zkVsWKXwHBkJH9KsQFlVO HT+Jgp879XZ1I/Xjfw7FvL76Rh1Bqr4vTTwj5Ga23/drInXUqLJAi/uxFleI/EDZjocb bnIg== X-Received: by 10.180.77.199 with SMTP id u7mr5950109wiw.42.1426862211602; Fri, 20 Mar 2015 07:36:51 -0700 (PDT) Received: from juno.home.vuxu.org ([2001:4ca0:0:f231:a288:b4ff:fea1:ce50]) by mx.google.com with ESMTPSA id d9sm3262326wib.20.2015.03.20.07.36.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Mar 2015 07:36:50 -0700 (PDT) Received: from localhost (juno.home.vuxu.org [local]); by juno.home.vuxu.org (OpenSMTPD) with ESMTPA id 77d33c37; for ; Fri, 20 Mar 2015 14:36:49 +0000 (UTC) From: Christian Neukirchen To: tech@mdocml.bsd.lv Subject: compat_vasprintf.c: use va_copy Date: Fri, 20 Mar 2015 15:36:49 +0100 Message-ID: <87vbhv7n26.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux) X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain Hi, When building CVS HEAD on Linux x86_64/glibc, the vasprintf check fails when -D_GNU_SOURCE is not passed, and mdocml falls back to compat_vasprintf.c. This version of vasprintf.c segfaults on glibc, because the same va_list is used twice. Probably affects other architectures too. The solution is to use va_copy to get a second va_list. --- compat_vasprintf.c +++ compat_vasprintf.c @@ -38,9 +38,13 @@ vasprintf(char **ret, const char *format, va_list ap) { char buf[2]; int sz; + va_list ap2; - if ((sz = vsnprintf(buf, sizeof(buf), format, ap)) != -1 && - (*ret = malloc(sz + 1)) != NULL) { + va_copy(ap2, ap); + sz = vsnprintf(buf, sizeof(buf), format, ap2); + va_end(ap2); + + if (sz != -1 && (*ret = malloc(sz + 1)) != NULL) { if (vsnprintf(*ret, sz + 1, format, ap) == sz) return(sz); free(*ret); cu, -- Christian Neukirchen http://chneukirchen.org -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv