[popt] Partially applied patches/popt-1.16-28.19.suse/popt-libc-updates.patch.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Mon, 7 Sep 2015 21:07:59 +0000 (17:07 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Mon, 7 Sep 2015 21:07:59 +0000 (17:07 -0400)
The secure_getenv() patch was applied, though I enabled a fallback to
getenv(), since Windows doesn't have secure_getenv().

The strerror_r() patch was NOT applied, since Windows doesn't have
this (though it does have strerror_s() starting with MSVC 2005).
More importantly, the strerror_r() usage is WRONG; it ends up returning
a pointer to an automatic array variable, which can easily result in
shenanigans occurring.

extlib/popt/config.h.in
extlib/popt/popt.c
extlib/popt/poptconfig.c
extlib/popt/poptint.h
extlib/popt/system.h

index 7ff5e1c..8a902fc 100644 (file)
 /* Define to 1 if you have the `vasprintf' function. */
 #cmakedefine HAVE_VASPRINTF
 
-/* Define to 1 if you have the `secure_getenv' function. */
-#cmakedefine HAVE_SECURE_GETENV
-
 /* Define to 1 if you have the `__secure_getenv' function. */
 #cmakedefine HAVE___SECURE_GETENV
 
+/* Define to 1 if you have the `secure_getenv' function. */
+#cmakedefine HAVE_SECURE_GETENV
+
 /* Define to the sub-directory in which libtool stores uninstalled libraries.
    */
 #cmakedefine LT_OBJDIR
index 19054ea..c1301c2 100644 (file)
@@ -217,7 +217,7 @@ poptContext poptGetContext(const char * name, int argc, const char ** argv,
     con->execAbsolute = 1;
     con->arg_strip = NULL;
 
-    if (getenv("POSIXLY_CORRECT") || getenv("POSIX_ME_HARDER"))
+    if (secure_getenv("POSIXLY_CORRECT") || secure_getenv("POSIX_ME_HARDER"))
        con->flags |= POPT_CONTEXT_POSIXMEHARDER;
 
     if (name)
@@ -463,7 +463,7 @@ const char * findProgramPath(/*@null@*/ const char * argv0)
     if (strchr(argv0, '/'))
        return xstrdup(argv0);
 
-    if ((path = getenv("PATH")) == NULL || (path = xstrdup(path)) == NULL)
+    if ((path = secure_getenv("PATH")) == NULL || (path = xstrdup(path)) == NULL)
        return NULL;
 
     /* The return buffer in t is big enough for any path. */
index a903ebf..e462468 100644 (file)
@@ -556,7 +556,7 @@ int poptReadDefaultConfig(poptContext con, /*@unused@*/ UNUSED(int useEnv))
 #endif
 
     /* Gens/GS II: TODO: Add Windows support. */
-    if ((home = getenv("HOME"))) {
+    if ((home = secure_getenv("HOME"))) {
        char * fn = malloc(strlen(home) + 20);
        if (fn != NULL) {
            (void) stpcpy(stpcpy(fn, home), "/.popt");
index 0bf63bd..adb641f 100644 (file)
@@ -9,8 +9,21 @@
 #ifndef H_POPTINT
 #define H_POPTINT
 
+/* Gens/GS II: Only use GCC visibility if it's supported. */
+/* TODO: 4.2.0 minimum, or older? */
+#if !defined(_WIN32) && \
+    defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+#ifndef HAVE_GCC_VISIBILITY
+#define HAVE_GCC_VISIBILITY 1
+#endif
+#endif
+
 #include <stdint.h>
 
+#ifdef HAVE_GCC_VISIBILITY
+#pragma GCC visibility push(hidden)
+#endif
+
 /**
  * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
  * @param p            memory to free
@@ -150,6 +163,10 @@ struct poptContext_s {
     pbm_set * arg_strip;
 };
 
+#ifdef HAVE_GCC_VISIBILITY
+#pragma GCC visibility pop
+#endif
+
 #if defined(POPT_fprintf)
 #define        POPT_dgettext   dgettext
 #else
@@ -183,6 +200,10 @@ extern char *nl_langinfo (nl_item __item)
 #endif
 #endif
 
+#ifdef HAVE_GCC_VISIBILITY
+#pragma GCC visibility push(hidden)
+#endif
+
 #if defined(HAVE_DCGETTEXT) && !defined(__LCLINT__)
 char *POPT_dgettext(const char * dom, const char * str)
        /*@*/;
@@ -201,6 +222,10 @@ const char *POPT_next_char (/*@returned@*/ const char *str)
 
 #endif
 
+#ifdef HAVE_GCC_VISIBILITY
+#pragma GCC visibility pop(hidden)
+#endif
+
 /** Gens/GS II: libintl.h is required even if ENABLE_NLS is disabled. **/
 #if /*defined(ENABLE_NLS) &&*/ defined(HAVE_LIBINTL_H)
 #include <libintl.h>
index ba504de..f9afe3c 100644 (file)
@@ -1,10 +1,9 @@
 /**
  * \file popt/system.h
  */
+#pragma once
 
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #ifdef _MSC_VER
 /* Gens/GS II: MSVC doesn't support 'inline' in C mode. */
 #endif
 #endif /* _MSC_VER */
 
+/* Gens/GS II: Only use GCC visibility if it's supported. */
+/* TODO: 4.2.0 minimum, or older? */
+#if !defined(_WIN32) && \
+    defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+#ifndef HAVE_GCC_VISIBILITY
+#define HAVE_GCC_VISIBILITY 1
+#endif
+#endif
+
 #if defined (__GLIBC__) && defined(__LCLINT__)
 /*@-declundef@*/
 /*@unchecked@*/
@@ -88,6 +96,9 @@ typedef long ssize_t;
 #include <libc.h>
 #endif
 
+#ifdef HAVE_GCC_VISIBILITY
+#pragma GCC visibility push(hidden)
+#endif
 /*@-incondefs@*/
 /*@mayexit@*/ /*@only@*/ /*@out@*/ /*@unused@*/
 void * xmalloc (size_t size)
@@ -123,6 +134,10 @@ static inline char * stpcpy (char *dest, const char * src) {
 }
 #endif
 
+#ifdef HAVE_GCC_VISIBILITY
+#pragma GCC visibility pop
+#endif
+
 /* Memory allocation via macro defs to get meaningful locations from mtrace() */
 #if defined(HAVE_MCHECK_H) && defined(__GNUC__)
 #define        vmefail()       (fprintf(stderr, "virtual memory exhausted.\n"), exit(EXIT_FAILURE), NULL)
@@ -137,10 +152,16 @@ static inline char * stpcpy (char *dest, const char * src) {
 #define        xstrdup(_str)   strdup(_str)
 #endif  /* defined(HAVE_MCHECK_H) && defined(__GNUC__) */
 
-#if defined(HAVE_SECURE_GETENV) && !defined(__LCLINT__)
-#define        getenv(_s)      secure_getenv(_s)
-#elif defined(HAVE___SECURE_GETENV) && !defined(__LCLINT__)
-#define        getenv(_s)      __secure_getenv(_s)
+#ifndef HAVE_SECURE_GETENV
+#  ifdef HAVE___SECURE_GETENV
+#    define secure_getenv __secure_getenv
+#  else
+/* Gens/GS II: FIXME: Implement secure_getenv() for non-GNU systems.
+#    error neither secure_getenv nor __secure_getenv is available
+*/
+#    pragma message("WARNING: secure_getenv() is unavailable; please implement a replacement.")
+#    define secure_getenv(_s) getenv(_s)
+#  endif
 #endif
 
 #if !defined(__GNUC__) && !defined(__attribute__)