[PATCH] Fix the FreeBSD build

Jeremy Allison jra at samba.org
Thu Jun 8 23:05:04 UTC 2017


On Wed, Jun 07, 2017 at 10:09:50PM +1200, Andrew Bartlett via samba-technical wrote:
> On Wed, 2017-06-07 at 11:24 +0200, Ralph Böhme via samba-technical
> wrote:
> > Hi Gary,
> > 
> > On Tue, Jun 06, 2017 at 11:12:50AM +1200, Gary Lockyer via samba-technical wrote:
> > > I don't see a problem, I was hoping to have the wrapped version of
> > > strerror_r done on Friday.  But it's causing issues with hiemdal, and
> > > I've yet to get a clean test run, which suggests I'm still missing
> > > something.
> > 
> > ok, thanks for confirming. So I went ahead and pushed Volker's fix.
> 
> I think I finally have a patch set that allows us to use strerror_r. 
> It certainly was a fight!

LGTM. RB+.

> However the FreeBSD 9 build fails for me for other reasons, I had to
> add:
> 
> iff --git a/lib/replace/system/network.h b/lib/replace/system/network.h
> index 8254551..1fe53ad 100644
> --- a/lib/replace/system/network.h
> +++ b/lib/replace/system/network.h
> @@ -75,9 +75,10 @@
>  #include <netinet/ip.h>
>  #endif
>  
> -#ifdef HAVE_NET_IF_H
>  #include <net/if.h>
> -#endif
> +
> +#include <net/if_var.h>
> +#include <net/if_types.h>
>  
> and revert 1670d00be88108a483f04c9763012504499b99e4.
> 
> Once I did that, the attached built.  It also builds on Linux.
> 
> I think we need to talk about ways to get a more diverse set of build
> hosts into our CI process.  I have some ideas around using GitLab and
> gitlab CI for that, I'll write more when I can make some specific
> suggestions.
> 
> Thanks,
> 
> Andrew Bartlett
> 
> -- 
> Andrew Bartlett                       http://samba.org/~abartlet/
> Authentication Developer, Samba Team  http://samba.org
> Samba Developer, Catalyst IT          http://catalyst.net.nz/services/samba

> From f48eae9bb3e5e68b65ec5c21c80752410a7f78ed Mon Sep 17 00:00:00 2001
> From: Gary Lockyer <gary at catalyst.net.nz>
> Date: Thu, 1 Jun 2017 13:26:38 +1200
> Subject: [PATCH] strerror_r: provide XSI-compliant strerror_r
> 
> Provide a XSI-compliant strerror_r on GNU based systems.
> The default GNU strerror_r is not XSI-compliant, this patch wraps the
> GNU-specific call in an XSI-compliant wrapper.
> 
> This reverts 18ed32ce0821d11c0c06d82c07ba1c27b0c2b886 which tried to
> make Heimdal use roken, rather than libreplace for strerror_r.
> 
> Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
> Signed-off-by: Andrew Bartlett <abartlet at samba.org>
> ---
>  lib/replace/replace.c                          | 17 ++++++
>  lib/replace/replace.h                          |  2 +-
>  lib/replace/wscript                            |  7 +++
>  source4/dsdb/samdb/ldb_modules/password_hash.c |  6 +-
>  source4/heimdal/lib/roken/strerror_r.c         | 84 --------------------------
>  source4/heimdal_build/config.h                 |  3 +
>  source4/heimdal_build/wscript_build            |  1 -
>  source4/heimdal_build/wscript_configure        |  7 ---
>  8 files changed, 33 insertions(+), 94 deletions(-)
>  delete mode 100644 source4/heimdal/lib/roken/strerror_r.c
> 
> diff --git a/lib/replace/replace.c b/lib/replace/replace.c
> index b5d7f11..1e9833f 100644
> --- a/lib/replace/replace.c
> +++ b/lib/replace/replace.c
> @@ -820,6 +820,23 @@ int rep_strerror_r(int errnum, char *buf, size_t buflen)
>  	strncpy(buf, s, buflen);
>  	return 0;
>  }
> +#elif (!defined(STRERROR_R_XSI_NOT_GNU))
> +#undef strerror_r
> +int rep_strerror_r(int errnum, char *buf, size_t buflen)
> +{
> +	char *s = strerror_r(errnum, buf, buflen);
> +	if (s == NULL) {
> +		/* Shouldn't happen, should always get a string */
> +		return EINVAL;
> +	} else if (s != buf) {
> +		strlcpy(buf, s, buflen);
> +		if (strlen(s) > buflen - 1) {
> +			return ERANGE;
> +		}
> +	}
> +	return 0;
> +
> +}
>  #endif
>  
>  #ifndef HAVE_CLOCK_GETTIME
> diff --git a/lib/replace/replace.h b/lib/replace/replace.h
> index 1dbeacf..a41e9f8 100644
> --- a/lib/replace/replace.h
> +++ b/lib/replace/replace.h
> @@ -628,7 +628,7 @@ ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
>  char *rep_get_current_dir_name(void);
>  #endif
>  
> -#ifndef HAVE_STRERROR_R
> +#if (!defined(HAVE_STRERROR_R) || !defined(STRERROR_R_XSI_NOT_GNU))
>  #define strerror_r rep_strerror_r
>  int rep_strerror_r(int errnum, char *buf, size_t buflen);
>  #endif
> diff --git a/lib/replace/wscript b/lib/replace/wscript
> index eeb1b3e..33f49eb 100644
> --- a/lib/replace/wscript
> +++ b/lib/replace/wscript
> @@ -627,6 +627,13 @@ removeea setea
>  
>      conf.RECURSE('system')
>      conf.SAMBA_CONFIG_H()
> +    if conf.CHECK_FUNCS('strerror_r'):
> +        # Check if strerror_r is XSI-Compatable, the default GNU implementation
> +        # is not
> +        conf.CHECK_CODE('int strerror_r(int errnum, char *buf, size_t buflen);',
> +                        'STRERROR_R_XSI_NOT_GNU',
> +                        headers='string.h', addmain=False, link=False,
> +                        msg="Checking for XSI (rather than GNU) prototype for strerror_r")
>  
>  
>  REPLACEMENT_FUNCTIONS = {
> diff --git a/source4/dsdb/samdb/ldb_modules/password_hash.c b/source4/dsdb/samdb/ldb_modules/password_hash.c
> index 8e8dc2c..1eb39da 100644
> --- a/source4/dsdb/samdb/ldb_modules/password_hash.c
> +++ b/source4/dsdb/samdb/ldb_modules/password_hash.c
> @@ -1544,12 +1544,16 @@ static int setup_primary_userPassword_hash(
>  #endif
>  	if (hash == NULL) {
>  		char buf[1024];
> +		int err = strerror_r(errno, buf, sizeof(buf));
> +		if (err != 0) {
> +			strlcpy(buf, "Unknown error", sizeof(buf)-1);
> +		}
>  		ldb_asprintf_errstring(
>  			ldb,
>  			"setup_primary_userPassword: generation of a %s "
>  			"password hash failed: (%s)",
>  			scheme,
> -			strerror_r(errno, buf, sizeof(buf)));
> +			buf);
>  		TALLOC_FREE(frame);
>  		return LDB_ERR_OPERATIONS_ERROR;
>  	}
> diff --git a/source4/heimdal/lib/roken/strerror_r.c b/source4/heimdal/lib/roken/strerror_r.c
> deleted file mode 100644
> index 85271ec..0000000
> --- a/source4/heimdal/lib/roken/strerror_r.c
> +++ /dev/null
> @@ -1,84 +0,0 @@
> -/*
> - * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan
> - * (Royal Institute of Technology, Stockholm, Sweden).
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - *
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - *
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - *
> - * 3. Neither the name of the Institute nor the names of its contributors
> - *    may be used to endorse or promote products derived from this software
> - *    without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - */
> -
> -#include <config.h>
> -
> -#if (!defined(HAVE_STRERROR_R) && !defined(strerror_r)) || (!defined(STRERROR_R_PROTO_COMPATIBLE) && defined(HAVE_STRERROR_R))
> -
> -#include <stdio.h>
> -#include <string.h>
> -#include <errno.h>
> -#include "roken.h"
> -
> -#ifdef _MSC_VER
> -
> -int ROKEN_LIB_FUNCTION
> -rk_strerror_r(int eno, char * strerrbuf, size_t buflen)
> -{
> -    errno_t err;
> -
> -    err = strerror_s(strerrbuf, buflen, eno);
> -    if (err != 0) {
> -        int code;
> -        code = sprintf_s(strerrbuf, buflen, "Error % occurred.", eno);
> -        err = ((code != 0)? errno : 0);
> -    }
> -
> -    return err;
> -}
> -
> -#else  /* _MSC_VER */
> -
> -int ROKEN_LIB_FUNCTION
> -rk_strerror_r(int eno, char *strerrbuf, size_t buflen)
> -{
> -    /* Assume is the linux broken strerror_r (returns the a buffer (char *) if the input buffer wasn't use */
> -#ifdef HAVE_STRERROR_R
> -    const char *str;
> -    str = strerror_r(eno, strerrbuf, buflen);
> -    if (str != strerrbuf)
> -	if (strlcpy(strerrbuf, str, buflen) >= buflen)
> -	    return ERANGE;
> -    return 0;
> -#else
> -    int ret;
> -    ret = strlcpy(strerrbuf, strerror(eno), buflen);
> -    if (ret > buflen)
> -	return ERANGE;
> -    return 0;
> -#endif
> -}
> -
> -#endif  /* !_MSC_VER */
> -
> -#endif
> diff --git a/source4/heimdal_build/config.h b/source4/heimdal_build/config.h
> index 2d113ae..a766922 100644
> --- a/source4/heimdal_build/config.h
> +++ b/source4/heimdal_build/config.h
> @@ -49,4 +49,7 @@
>  /* heimdal now wants some atomic ops - ask for the non-atomic ones for Samba */
>  #define HEIM_BASE_NON_ATOMIC 1
>  
> +/* lib/replace provides an XSI Compatable strerror_r so use that */
> +#define STRERROR_R_PROTO_COMPATIBLE
> +
>  #endif
> diff --git a/source4/heimdal_build/wscript_build b/source4/heimdal_build/wscript_build
> index c733b8f..2072be4 100644
> --- a/source4/heimdal_build/wscript_build
> +++ b/source4/heimdal_build/wscript_build
> @@ -408,7 +408,6 @@ if not bld.CONFIG_SET('USING_SYSTEM_ROKEN'):
>          lib/roken/resolve.c
>          lib/roken/socket.c
>          lib/roken/roken_gethostby.c
> -        lib/roken/strerror_r.c
>      '''
>  
>      HEIMDAL_LIBRARY('roken',
> diff --git a/source4/heimdal_build/wscript_configure b/source4/heimdal_build/wscript_configure
> index 67ac34b..354d44f 100644
> --- a/source4/heimdal_build/wscript_configure
> +++ b/source4/heimdal_build/wscript_configure
> @@ -28,13 +28,6 @@ conf.CHECK_FUNCS('''atexit cgetent getprogname setprogname gethostname
>              strptime strsep strsep_copy    strtok_r strupr swab umask uname unsetenv
>              closefrom err warn errx warnx flock writev''')
>  
> -if conf.CHECK_FUNCS('strerror_r'):
> -    # Check if strerror_r is BSD compatible (default GNU implementation is not what Heimdal expects)
> -    conf.CHECK_CODE('int strerror_r(int errnum, char *buf, size_t buflen);',
> -                    'STRERROR_R_PROTO_COMPATIBLE',
> -                    headers='string.h', addmain=False, link=False,
> -                    msg="Checking for XSI (rather than GNU) prototype for strerror_r")
> -
>  conf.CHECK_FUNCS_IN('hstrerror', 'resolv socket nsl', checklibc=True)
>  conf.CHECK_FUNCS_IN('''getnameinfo sendmsg socket getipnodebyname gethostent gethostent_r
>                         sethostent endhostent getipnodebyaddr freehostent gethostbyname
> -- 
> 2.9.4
> 




More information about the samba-technical mailing list