Instead of trying to make weak functions work on all platforms,

just use a registration function for a plugin-specific setlocale
function.  The sudoers version just wraps sudoers_setlocale().
This commit is contained in:
Todd C. Miller
2015-05-11 14:51:32 -06:00
parent fc7143760b
commit 8bc70a635c
19 changed files with 90 additions and 940 deletions

View File

@@ -101,21 +101,21 @@ LTOBJS = alloc.lo event.lo fatal.lo key_val.lo gethostname.lo gettime.lo \
setgroups.lo strtobool.lo strtoid.lo strtomode.lo sudo_conf.lo \
sudo_debug.lo sudo_dso.lo term.lo ttysize.lo @COMMON_OBJS@ @LTLIBOBJS@
ATOFOO_TEST_OBJS = atofoo_test.lo locale_stub.lo
ATOFOO_TEST_OBJS = atofoo_test.lo
MKTEMP_TEST_OBJS = mktemp_test.lo locale_stub.lo
MKTEMP_TEST_OBJS = mktemp_test.lo
PARSELN_TEST_OBJS = parseln_test.lo locale_stub.lo
PARSELN_TEST_OBJS = parseln_test.lo
PROGNAME_TEST_OBJS = progname_test.lo progname.lo
CONF_TEST_OBJS = conf_test.lo locale_stub.lo
CONF_TEST_OBJS = conf_test.lo
HLTQ_TEST_OBJS = hltq_test.lo locale_stub.lo
HLTQ_TEST_OBJS = hltq_test.lo
FNM_TEST_OBJS = fnm_test.lo locale_stub.lo
FNM_TEST_OBJS = fnm_test.lo
GLOBTEST_OBJS = globtest.lo locale_stub.lo
GLOBTEST_OBJS = globtest.lo
all: libsudo_util.la
@@ -309,9 +309,9 @@ aix.lo: $(srcdir)/aix.c $(incdir)/compat/stdbool.h $(incdir)/sudo_alloc.h \
$(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
$(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/aix.c
alloc.lo: $(srcdir)/alloc.c $(incdir)/sudo_alloc.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
$(top_builddir)/config.h
alloc.lo: $(srcdir)/alloc.c $(incdir)/compat/stdbool.h $(incdir)/sudo_alloc.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_fatal.h \
$(incdir)/sudo_gettext.h $(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/alloc.c
atofoo_test.lo: $(srcdir)/regress/atofoo/atofoo_test.c \
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
@@ -372,8 +372,8 @@ gethostname.lo: $(srcdir)/gethostname.c $(incdir)/compat/stdbool.h \
getline.lo: $(srcdir)/getline.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/getline.c
getopt_long.lo: $(srcdir)/getopt_long.c $(incdir)/compat/getopt.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_fatal.h \
$(top_builddir)/config.h
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_fatal.h $(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/getopt_long.c
gettime.lo: $(srcdir)/gettime.c $(incdir)/compat/stdbool.h \
$(incdir)/compat/timespec.h $(incdir)/sudo_compat.h \
@@ -407,18 +407,10 @@ key_val.lo: $(srcdir)/key_val.c $(incdir)/compat/stdbool.h \
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
$(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/key_val.c
lbuf.lo: $(srcdir)/lbuf.c $(incdir)/sudo_alloc.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_debug.h $(incdir)/sudo_lbuf.h $(incdir)/sudo_queue.h \
$(top_builddir)/config.h
lbuf.lo: $(srcdir)/lbuf.c $(incdir)/compat/stdbool.h $(incdir)/sudo_alloc.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h $(incdir)/sudo_lbuf.h \
$(incdir)/sudo_queue.h $(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/lbuf.c
locale_stub.lo: $(top_srcdir)/src/locale_stub.c $(incdir)/sudo_compat.h \
$(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
$(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(top_srcdir)/src/locale_stub.c
locale_weak.lo: $(srcdir)/locale_weak.c $(incdir)/sudo_compat.h \
$(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
$(top_builddir)/config.h
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/locale_weak.c
locking.lo: $(srcdir)/locking.c $(incdir)/compat/stdbool.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \

View File

@@ -46,6 +46,8 @@ SLIST_HEAD(sudo_fatal_callback_list, sudo_fatal_callback);
static struct sudo_fatal_callback_list callbacks = SLIST_HEAD_INITIALIZER(&callbacks);
static sudo_conv_t sudo_warn_conversation;
static bool (*sudo_warn_setlocale)(bool, int *);
static bool (*sudo_warn_setlocale_prev)(bool, int *);
static void _warning(int errnum, const char *fmt, va_list ap);
@@ -136,6 +138,12 @@ sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap)
static void
_warning(int errnum, const char *fmt, va_list ap)
{
int cookie;
/* Set user locale if setter was specified. */
if (sudo_warn_setlocale != NULL)
sudo_warn_setlocale(false, &cookie);
if (sudo_warn_conversation != NULL) {
struct sudo_conv_message msgs[6];
int nmsgs = 0;
@@ -155,7 +163,7 @@ _warning(int errnum, const char *fmt, va_list ap)
msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG;
msgs[nmsgs++].msg = ": ";
msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG;
msgs[nmsgs++].msg = sudo_warn_strerror(errnum);
msgs[nmsgs++].msg = strerror(errnum);
}
msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG;
msgs[nmsgs++].msg = "\n";
@@ -170,10 +178,14 @@ _warning(int errnum, const char *fmt, va_list ap)
}
if (errnum) {
fputs(": ", stderr);
fputs(sudo_warn_strerror(errnum), stderr);
fputs(strerror(errnum), stderr);
}
putc('\n', stderr);
}
/* Restore old locale as needed. */
if (sudo_warn_setlocale != NULL)
sudo_warn_setlocale(true, &cookie);
}
/*
@@ -232,3 +244,35 @@ sudo_warn_set_conversation_v1(sudo_conv_t conv)
{
sudo_warn_conversation = conv;
}
/*
* Set the locale function so the plugin can use a non-default
* locale for user warnings.
*/
void
sudo_warn_set_locale_func_v1(bool (*func)(bool, int *))
{
sudo_warn_setlocale_prev = sudo_warn_setlocale;
sudo_warn_setlocale = func;
}
#ifdef HAVE_LIBINTL_H
char *
sudo_warn_gettext_v1(const char *msgid)
{
int cookie;
char *msg;
/* Set user locale if setter was specified. */
if (sudo_warn_setlocale != NULL)
sudo_warn_setlocale(false, &cookie);
msg = gettext(msgid);
/* Restore old locale as needed. */
if (sudo_warn_setlocale != NULL)
sudo_warn_setlocale(true, &cookie);
return msg;
}
#endif /* HAVE_LIBINTL_H */

View File

@@ -1,80 +0,0 @@
/*
* Copyright (c) 2013-2015 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <config.h>
#include <sys/types.h>
#ifdef HAVE_SYS_WEAK_ALIAS
#include <stdio.h>
#include <stdlib.h>
#ifdef HAVE_STRING_H
# include <string.h>
#endif /* HAVE_STRING_H */
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
#define DEFAULT_TEXT_DOMAIN "sudo"
#include "sudo_gettext.h" /* must be included before sudo_compat.h */
#include "sudo_compat.h"
#include "sudo_fatal.h"
/*
* Weak symbols for sudo_warn_gettext_v1() and sudo_warn_strerror_v1().
* These stubs are provided to make libsudo_util link with no undefined
* symbols.
*/
# ifdef HAVE_LIBINTL_H
/* We only need to swap locales in the plugin. */
char *
sudo_warn_gettext_weak(const char *msgid)
{
return gettext(msgid);
}
# if defined(HAVE_SYS_WEAK_ALIAS_ATTRIBUTE)
char *sudo_warn_gettext_v1(const char *msgid)
__attribute__((weak, alias("sudo_warn_gettext_weak")));
# elif defined(HAVE_SYS_WEAK_ALIAS_PRAGMA)
# pragma weak sudo_warn_gettext_v1 = sudo_warn_gettext_weak
# elif defined(HAVE_SYS_WEAK_ALIAS_HPSECONDARY)
# pragma _HP_SECONDARY_DEF sudo_warn_gettext_weak sudo_warn_gettext_v1
# elif defined(HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE)
# pragma _CRI duplicate sudo_warn_gettext_v1 as sudo_warn_gettext_weak
# endif
# endif /* HAVE_LIBINTL_H */
/* We only need to swap locales in the plugin. */
char *
sudo_warn_strerror_weak(int errnum)
{
return strerror(errnum);
}
# if defined(HAVE_SYS_WEAK_ALIAS_ATTRIBUTE)
char *sudo_warn_strerror_v1(int errnum)
__attribute__((weak, alias("sudo_warn_strerror_weak")));
# elif defined(HAVE_SYS_WEAK_ALIAS_PRAGMA)
# pragma weak sudo_warn_strerror_v1 = sudo_warn_strerror_weak
# elif defined(HAVE_SYS_WEAK_ALIAS_HPSECONDARY)
# pragma _HP_SECONDARY_DEF sudo_warn_strerror_weak sudo_warn_strerror_v1
# elif defined(HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE)
# pragma _CRI duplicate sudo_warn_strerror_v1 as sudo_warn_strerror_weak
# endif
#endif /* HAVE_SYS_WEAK_ALIAS */

View File

@@ -96,4 +96,5 @@ sudo_vwarn_nodebug_v1
sudo_vwarnx_nodebug_v1
sudo_warn_nodebug_v1
sudo_warn_set_conversation_v1
sudo_warn_set_locale_func_v1
sudo_warnx_nodebug_v1