CLANG 3.2 breaks security/pam_ssh_agent_auth on stable/9
Kimmo Paasiala
kpaasial at gmail.com
Wed Jan 30 06:21:13 UTC 2013
On Wed, Jan 30, 2013 at 7:27 AM, James <james at hicag.org> wrote:
> I was able to correct the problem as well by prefixing strnvis, avoiding the
> symbol collision. I also found PR: ports/172941 which also has a fix.
>
> Using my patch or the patch in ports/172941 fixes the segfault for me in
> stable/9. However, I quickly ran into another problem. I can't remember the
> error message exactly, it was something like "Unable to initialize PAM:
> Unknown file descriptor". A ktrace didn't reveal anything obvious. I'll try
> to test it out tomorrow.
>
> --
> James.
Try the attached patch. Just drop it into
/usr/ports/security/pam_ssh_agent_auth/files directory and recompile.
This will make the port use the system strnvis() with correctly
ordered arguments if one is available (HAVE_STRNVIS defined) and an
_openbsd suffixed version if not.
-Kimmo
-------------- next part --------------
--- ../../../pam_ssh_agent_auth/work/pam_ssh_agent_auth-0.9.3/openbsd-compat/vis.h 2009-01-05 09:31:07.000000000 +0200
+++ openbsd-compat/vis.h 2013-01-30 07:13:19.782431257 +0200
@@ -79,15 +79,16 @@
*/
#define UNVIS_END 1 /* no more characters */
-char *vis(char *, int, int, int);
-int strvis(char *, const char *, int);
-int strnvis(char *, const char *, size_t, int)
+
+char *vis_openbsd(char *, int, int, int);
+int strvis_openbsd(char *, const char *, int);
+int strnvis_openbsd(char *, const char *, size_t, int)
__attribute__ ((__bounded__(__string__,1,3)));
-int strvisx(char *, const char *, size_t, int)
+int strvisx_openbsd(char *, const char *, size_t, int)
__attribute__ ((__bounded__(__string__,1,3)));
-int strunvis(char *, const char *);
-int unvis(char *, char, int *, int);
-ssize_t strnunvis(char *, const char *, size_t)
+int strunvis_openbsd(char *, const char *);
+int unvis_openbsd(char *, char, int *, int);
+ssize_t strnunvis_openbsd(char *, const char *, size_t)
__attribute__ ((__bounded__(__string__,1,3)));
#endif /* !_VIS_H_ */
--- ../../../pam_ssh_agent_auth/work/pam_ssh_agent_auth-0.9.3/log.c 2013-01-30 07:09:24.325405879 +0200
+++ log.c 2013-01-30 07:14:13.708422511 +0200
@@ -360,9 +360,13 @@
snprintf(fmtbuf, sizeof(fmtbuf), "%s: %s", preface, fmt);
vsnprintf(msgbuf, sizeof(msgbuf), fmtbuf, args);
}
-
- strnvis(fmtbuf, msgbuf, sizeof(fmtbuf),
+#if defined (HAVE_STRNVIS)
+ strnvis(fmtbuf, sizeof(fmtbuf), msgbuf,
+ log_on_stderr ? LOG_STDERR_VIS : LOG_SYSLOG_VIS);
+#else
+ strnvis_openbsd(fmtbuf, msgbuf, sizeof(fmtbuf),
log_on_stderr ? LOG_STDERR_VIS : LOG_SYSLOG_VIS);
+#endif
if(level == SYSLOG_LEVEL_FATAL) {
snprintf(msgbuf, sizeof msgbuf, "%s\r\nThis incident has been reported to the authorities\r\n", fmtbuf);
--- ../../../pam_ssh_agent_auth/work/pam_ssh_agent_auth-0.9.3/openbsd-compat/vis.c 2009-01-05 09:31:07.000000000 +0200
+++ openbsd-compat/vis.c 2013-01-30 07:31:50.516441571 +0200
@@ -54,7 +54,7 @@
* vis - visually encode characters
*/
char *
-vis(char *dst, int c, int flag, int nextc)
+vis_openbsd(char *dst, int c, int flag, int nextc)
{
if (isvisible(c)) {
*dst++ = c;
@@ -151,19 +151,19 @@
* This is useful for encoding a block of data.
*/
int
-strvis(char *dst, const char *src, int flag)
+strvis_openbsd(char *dst, const char *src, int flag)
{
char c;
char *start;
for (start = dst; (c = *src);)
- dst = vis(dst, c, flag, *++src);
+ dst = vis_openbsd(dst, c, flag, *++src);
*dst = '\0';
return (dst - start);
}
int
-strnvis(char *dst, const char *src, size_t siz, int flag)
+strnvis_openbsd(char *dst, const char *src, size_t siz, int flag)
{
char *start, *end;
char tbuf[5];
@@ -186,7 +186,7 @@
}
src++;
} else {
- i = vis(tbuf, c, flag, *++src) - tbuf;
+ i = vis_openbsd(tbuf, c, flag, *++src) - tbuf;
if (dst + i <= end) {
memcpy(dst, tbuf, i);
dst += i;
@@ -201,23 +201,23 @@
if (dst + i > end) {
/* adjust return value for truncation */
while ((c = *src))
- dst += vis(tbuf, c, flag, *++src) - tbuf;
+ dst += vis_openbsd(tbuf, c, flag, *++src) - tbuf;
}
return (dst - start);
}
int
-strvisx(char *dst, const char *src, size_t len, int flag)
+strvisx_openbsd(char *dst, const char *src, size_t len, int flag)
{
char c;
char *start;
for (start = dst; len > 1; len--) {
c = *src;
- dst = vis(dst, c, flag, *++src);
+ dst = vis_openbsd(dst, c, flag, *++src);
}
if (len)
- dst = vis(dst, *src, flag, '\0');
+ dst = vis_openbsd(dst, *src, flag, '\0');
*dst = '\0';
return (dst - start);
}
More information about the freebsd-stable
mailing list