tests: move GSS-API dynamic stub into debug-mode libcurl

Replace the `libstubgss.so`-based overload solution with one built into
libcurl at compile-time.

The previous, `LD_PRELOAD`-based, solution was non-portable, allowlisted
for Linux, BSD and Solaris. It also required non-debug builds, which
turned out to be an accidental condition:
7d342c723c. It also required a curl tool
built against a shared libcurl. Detecting this condition wasn't always
accurate, e.g. with certain cmake configurations.

The overload solution also didn't work on macOS, though it theoretically
should have:
- #17653
- #2394

Experiments on making the overload solution work in more envs:
- #17759
  That revealed that it also did not work on NetBSD, in CI.

The replacement solution is overloading the necessary GSS-API functions
for test 2056 and 2057 at compile time. It requires a debug-enabled curl
build (due to its insecure nature).

This makes these tests run on all platforms. Including most GSS jobs in
CI, that are running tests. (the exception is old-linux, non-debug jobs,
where it felt overkill to enable debug for this.)

The refactored GSS stub code needs to overload less than before because
it's free to use the official GSS API. (This didn't work with
the overload solution on Alpine for example). It can also use libcurl
functions, allowing to replace `snprintf()` with `msnprintf()`.

OS/400 is also overloading GSS API functions. I haven't tested how this
works after this PR. In theory it should, because this PR doesn't rely
on preprocessor overrides.

Note that for future GSS tests, it may be necessary to stub these GSS
API functions: `gss_inquire_context()`, `gss_unwrap()`, `gss_wrap()`.
They are on codepaths not (yet) touched by tests.

Also:
- stub-gss: check for token buffer overrun.
- stub-gss: replace size macros with `sizeof()`.
- GHA: enable debug for some jobs with GSS.
- GHA/linux: ignore results for 2056 and 2057 in the valgrind job.
  They leak the same way as seen with 2077 and 2078.
  Ref: 7020ba7979 #17462
  Ref: 146759716c #14430
- GHA/linux: fix to ignore `gss_import_name()` leaks in valgrind builds.
  only.
- lib/vauth/krb5_gssapi: reduce variable scope.
- lib/vauth/spnego_gssapi: reduce variable scope.
- tests/libtest: drop code and build logic dealing with `libstubgss`.
- runtests:
  - drop `ld_preload` feature.
  - drop special handling of `LD_PRELOAD` env in tests.
  - drop logic dealing with shared curl tool detection.
  - drop `LD_PRELOAD` envs from tests.

Follow-up to 56d949d31a #1687

Closes #17752
This commit is contained in:
Viktor Szakats 2025-06-25 01:45:04 +02:00
parent c9bb9cd165
commit 73840836a5
No known key found for this signature in database
GPG key ID: B5ABD165E2AEF201
19 changed files with 345 additions and 772 deletions

View file

@ -39,12 +39,9 @@ HTTP Negotiate authentication (stub krb5)
</name>
<features>
GSS-API
ld_preload
!Debug
Debug
</features>
<setenv>
LD_PRELOAD=libstubgss.so
LD_LIBRARY_PATH=%PWD/libtest/.libs:%PWD/libtest
CURL_STUB_GSS_CREDS="KRB5_Alice"
</setenv>
<command>

View file

@ -55,12 +55,9 @@ HTTP Negotiate authentication (stub NTLM)
</name>
<features>
GSS-API
ld_preload
!Debug
Debug
</features>
<setenv>
LD_PRELOAD=libstubgss.so
LD_LIBRARY_PATH=%PWD/libtest/.libs:%PWD/libtest
CURL_STUB_GSS_CREDS="NTLM_Alice"
</setenv>
<command>

View file

@ -41,7 +41,6 @@ BEGIN {
$CURLVERSION
$CURLVERNUM
$DATE
$has_shared
$LIBDIR
$UNITDIR
$TUNITDIR
@ -141,6 +140,5 @@ our $DNSCMD="dnsd.cmd"; # write DNS instructions here
our @protocols; # array of lowercase supported protocol servers
our %feature; # hash of enabled features
our %keywords; # hash of keywords from the test spec
our $has_shared; # built as a shared library
1;

View file

@ -22,7 +22,7 @@
#
###########################################################################
# Get BUNDLE, FIRST_C, FIRST_H, UTILS_C, UTILS_H, CURLX_C, TESTS_C, STUB_GSS_C, STUB_GSS_H variables
# Get BUNDLE, FIRST_C, FIRST_H, UTILS_C, UTILS_H, CURLX_C, TESTS_C variables
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
@ -61,9 +61,3 @@ set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIE
set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
curl_clang_tidy_tests(${BUNDLE} ${FIRST_C} ${UTILS_C} ${TESTS_C})
if(HAVE_GSSAPI AND UNIX)
add_library(stubgss SHARED EXCLUDE_FROM_ALL ${STUB_GSS_C})
set_target_properties(stubgss PROPERTIES UNITY_BUILD OFF)
add_dependencies(testdeps stubgss)
endif()

View file

@ -39,7 +39,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(srcdir) \
-I$(top_srcdir)/tests/unit
# Get BUNDLE, FIRST_C, FIRST_H, UTILS_C, UTILS_H, CURLX_C, TESTS_C, STUB_GSS_C, STUB_GSS_H variables
# Get BUNDLE, FIRST_C, FIRST_H, UTILS_C, UTILS_H, CURLX_C, TESTS_C variables
include Makefile.inc
EXTRA_DIST = CMakeLists.txt $(FIRST_C) $(FIRST_H) $(UTILS_C) $(UTILS_H) $(TESTS_C) \
@ -50,8 +50,6 @@ CFLAGS += @CURL_CFLAG_EXTRAS@
# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)
noinst_LTLIBRARIES =
if USE_CPPFLAG_CURL_STATICLIB
AM_CPPFLAGS += -DCURL_STATICLIB
endif
@ -63,24 +61,6 @@ AM_CPPFLAGS += -DCURLDEBUG
endif
AM_CPPFLAGS += -DCURL_NO_OLDIES -DCURL_DISABLE_DEPRECATION
AM_LDFLAGS =
AM_CFLAGS =
# Build a stub gssapi implementation for testing
if BUILD_STUB_GSS
noinst_LTLIBRARIES += libstubgss.la
libstubgss_la_CPPFLAGS =
libstubgss_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version -rpath /nowhere
if CURL_LT_SHLIB_USE_NO_UNDEFINED
libstubgss_la_LDFLAGS += -no-undefined
endif
libstubgss_la_CFLAGS = $(AM_CFLAGS) -g
libstubgss_la_SOURCES = $(STUB_GSS_C) $(STUB_GSS_H)
libstubgss_la_LIBADD =
libstubgss_la_DEPENDENCIES =
endif
if USE_CPPFLAG_CURL_STATICLIB
curlx_c_lib =
else

View file

@ -96,6 +96,3 @@ TESTS_C = \
lib3010.c lib3025.c lib3026.c lib3027.c \
lib3100.c lib3101.c lib3102.c lib3103.c lib3104.c lib3105.c \
lib3207.c lib3208.c
STUB_GSS_C = stub_gssapi.c
STUB_GSS_H = stub_gssapi.h

View file

@ -1,460 +0,0 @@
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at https://curl.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* SPDX-License-Identifier: curl
*
***************************************************************************/
/* Only provides the bare minimum to link with libcurl */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stub_gssapi.h"
#define MAX_CREDS_LENGTH 250
#define APPROX_TOKEN_LEN 250
enum min_err_code {
GSS_OK = 0,
GSS_NO_MEMORY,
GSS_INVALID_ARGS,
GSS_INVALID_CREDS,
GSS_INVALID_CTX,
GSS_SERVER_ERR,
GSS_NO_MECH,
GSS_LAST
};
static const char *min_err_table[] = {
"stub-gss: no error",
"stub-gss: no memory",
"stub-gss: invalid arguments",
"stub-gss: invalid credentials",
"stub-gss: invalid context",
"stub-gss: server returned error",
"stub-gss: cannot find a mechanism",
NULL
};
struct gss_ctx_id_t_desc_struct {
enum { NONE, KRB5, NTLM1, NTLM3 } sent;
int have_krb5;
int have_ntlm;
OM_uint32 flags;
char creds[MAX_CREDS_LENGTH];
};
/* simple implementation of strndup(), which isn't portable */
static char *my_strndup(const char *ptr, size_t len)
{
char *copy = malloc(len + 1);
if(!copy)
return NULL;
memcpy(copy, ptr, len);
copy[len] = '\0';
return copy;
}
OM_uint32 gss_init_sec_context(OM_uint32 *min,
gss_const_cred_id_t initiator_cred_handle,
gss_ctx_id_t *context_handle,
gss_const_name_t target_name,
const gss_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,
const gss_channel_bindings_t input_chan_bindings,
const gss_buffer_t input_token,
gss_OID *actual_mech_type,
gss_buffer_t output_token,
OM_uint32 *ret_flags,
OM_uint32 *time_rec)
{
/* The token will be encoded in base64 */
size_t length = APPROX_TOKEN_LEN * 3 / 4;
size_t used = 0;
char *token = NULL;
const char *creds = NULL;
gss_ctx_id_t ctx = NULL;
(void)initiator_cred_handle;
(void)mech_type;
(void)time_req;
(void)input_chan_bindings;
(void)actual_mech_type;
if(!min)
return GSS_S_FAILURE;
*min = 0;
if(!context_handle || !target_name || !output_token) {
*min = GSS_INVALID_ARGS;
return GSS_S_FAILURE;
}
creds = getenv("CURL_STUB_GSS_CREDS");
if(!creds || strlen(creds) >= MAX_CREDS_LENGTH) {
*min = GSS_INVALID_CREDS;
return GSS_S_FAILURE;
}
ctx = *context_handle;
if(ctx && strcmp(ctx->creds, creds)) {
*min = GSS_INVALID_CREDS;
return GSS_S_FAILURE;
}
output_token->length = 0;
output_token->value = NULL;
if(input_token && input_token->length) {
if(!ctx) {
*min = GSS_INVALID_CTX;
return GSS_S_FAILURE;
}
/* Server response, either D (RA==) or C (Qw==) */
if(((char *) input_token->value)[0] == 'D') {
/* Done */
switch(ctx->sent) {
case KRB5:
case NTLM3:
if(ret_flags)
*ret_flags = ctx->flags;
if(time_rec)
*time_rec = GSS_C_INDEFINITE;
return GSS_S_COMPLETE;
default:
*min = GSS_SERVER_ERR;
return GSS_S_FAILURE;
}
}
if(((char *) input_token->value)[0] != 'C') {
/* We only support Done or Continue */
*min = GSS_SERVER_ERR;
return GSS_S_FAILURE;
}
/* Continue */
switch(ctx->sent) {
case KRB5:
/* We sent KRB5 and it failed, let's try NTLM */
if(ctx->have_ntlm) {
ctx->sent = NTLM1;
break;
}
else {
*min = GSS_SERVER_ERR;
return GSS_S_FAILURE;
}
case NTLM1:
ctx->sent = NTLM3;
break;
default:
*min = GSS_SERVER_ERR;
return GSS_S_FAILURE;
}
}
else {
if(ctx) {
*min = GSS_INVALID_CTX;
return GSS_S_FAILURE;
}
ctx = (gss_ctx_id_t) calloc(1, sizeof(*ctx));
if(!ctx) {
*min = GSS_NO_MEMORY;
return GSS_S_FAILURE;
}
if(strstr(creds, "KRB5"))
ctx->have_krb5 = 1;
if(strstr(creds, "NTLM"))
ctx->have_ntlm = 1;
if(ctx->have_krb5)
ctx->sent = KRB5;
else if(ctx->have_ntlm)
ctx->sent = NTLM1;
else {
free(ctx);
*min = GSS_NO_MECH;
return GSS_S_FAILURE;
}
strcpy(ctx->creds, creds);
ctx->flags = req_flags;
}
token = malloc(length);
if(!token) {
free(ctx);
*min = GSS_NO_MEMORY;
return GSS_S_FAILURE;
}
/* Token format: creds:target:type:padding */
/* Note: this is using the *real* snprintf() and not the curl provided
one */
used = (size_t) snprintf(token, length, "%s:%s:%d:", creds,
(const char *)target_name, ctx->sent);
if(used >= length) {
free(token);
free(ctx);
*min = GSS_NO_MEMORY;
return GSS_S_FAILURE;
}
/* Overwrite null-terminator */
memset(token + used, 'A', length - used);
*context_handle = ctx;
output_token->value = token;
output_token->length = length;
return GSS_S_CONTINUE_NEEDED;
}
OM_uint32 gss_delete_sec_context(OM_uint32 *min,
gss_ctx_id_t *context_handle,
gss_buffer_t output_token)
{
(void)output_token;
if(!min)
return GSS_S_FAILURE;
if(!context_handle) {
*min = GSS_INVALID_CTX;
return GSS_S_FAILURE;
}
free(*context_handle);
*context_handle = NULL;
*min = 0;
return GSS_S_COMPLETE;
}
OM_uint32 gss_release_buffer(OM_uint32 *min,
gss_buffer_t buffer)
{
if(min)
*min = 0;
if(buffer && buffer->length) {
free(buffer->value);
buffer->length = 0;
}
return GSS_S_COMPLETE;
}
OM_uint32 gss_import_name(OM_uint32 *min,
const gss_buffer_t input_name_buffer,
const gss_OID input_name_type,
gss_name_t *output_name)
{
char *name = NULL;
(void)input_name_type;
if(!min)
return GSS_S_FAILURE;
if(!input_name_buffer || !output_name) {
*min = GSS_INVALID_ARGS;
return GSS_S_FAILURE;
}
name = my_strndup(input_name_buffer->value, input_name_buffer->length);
if(!name) {
*min = GSS_NO_MEMORY;
return GSS_S_FAILURE;
}
*output_name = (gss_name_t) name;
*min = 0;
return GSS_S_COMPLETE;
}
OM_uint32 gss_release_name(OM_uint32 *min,
gss_name_t *input_name)
{
if(min)
*min = 0;
if(input_name)
free(*input_name);
return GSS_S_COMPLETE;
}
OM_uint32 gss_display_status(OM_uint32 *min,
OM_uint32 status_value,
int status_type,
const gss_OID mech_type,
OM_uint32 *message_context,
gss_buffer_t status_string)
{
static const char maj_str[] = "Stub GSS error";
(void)mech_type;
if(min)
*min = 0;
if(message_context)
*message_context = 0;
if(status_string) {
status_string->value = NULL;
status_string->length = 0;
if(status_value >= GSS_LAST)
return GSS_S_FAILURE;
switch(status_type) {
case GSS_C_GSS_CODE:
status_string->value = strdup(maj_str);
break;
case GSS_C_MECH_CODE:
status_string->value = strdup(min_err_table[status_value]);
break;
default:
return GSS_S_FAILURE;
}
if(status_string->value)
status_string->length = strlen(status_string->value);
else
return GSS_S_FAILURE;
}
return GSS_S_COMPLETE;
}
/* Stubs returning error */
OM_uint32 gss_display_name(OM_uint32 *min,
gss_const_name_t input_name,
gss_buffer_t output_name_buffer,
gss_OID *output_name_type)
{
(void)min;
(void)input_name;
(void)output_name_buffer;
(void)output_name_type;
return GSS_S_FAILURE;
}
OM_uint32 gss_inquire_context(OM_uint32 *min,
gss_const_ctx_id_t context_handle,
gss_name_t *src_name,
gss_name_t *targ_name,
OM_uint32 *lifetime_rec,
gss_OID *mech_type,
OM_uint32 *ctx_flags,
int *locally_initiated,
int *open_context)
{
(void)min;
(void)context_handle;
(void)src_name;
(void)targ_name;
(void)lifetime_rec;
(void)mech_type;
(void)ctx_flags;
(void)locally_initiated;
(void)open_context;
return GSS_S_FAILURE;
}
OM_uint32 gss_wrap(OM_uint32 *min,
gss_const_ctx_id_t context_handle,
int conf_req_flag,
gss_qop_t qop_req,
const gss_buffer_t input_message_buffer,
int *conf_state,
gss_buffer_t output_message_buffer)
{
(void)min;
(void)context_handle;
(void)conf_req_flag;
(void)qop_req;
(void)input_message_buffer;
(void)conf_state;
(void)output_message_buffer;
return GSS_S_FAILURE;
}
OM_uint32 gss_unwrap(OM_uint32 *min,
gss_const_ctx_id_t context_handle,
const gss_buffer_t input_message_buffer,
gss_buffer_t output_message_buffer,
int *conf_state,
gss_qop_t *qop_state)
{
(void)min;
(void)context_handle;
(void)input_message_buffer;
(void)output_message_buffer;
(void)conf_state;
(void)qop_state;
return GSS_S_FAILURE;
}
OM_uint32 gss_seal(OM_uint32 *min,
gss_ctx_id_t context_handle,
int conf_req_flag,
int qop_req,
gss_buffer_t input_message_buffer,
int *conf_state,
gss_buffer_t output_message_buffer)
{
(void)min;
(void)context_handle;
(void)conf_req_flag;
(void)qop_req;
(void)input_message_buffer;
(void)conf_state;
(void)output_message_buffer;
return GSS_S_FAILURE;
}
OM_uint32 gss_unseal(OM_uint32 *min,
gss_ctx_id_t context_handle,
gss_buffer_t input_message_buffer,
gss_buffer_t output_message_buffer,
int *conf_state,
int *qop_state)
{
(void)min;
(void)context_handle;
(void)input_message_buffer;
(void)output_message_buffer;
(void)conf_state;
(void)qop_state;
return GSS_S_FAILURE;
}

View file

@ -1,186 +0,0 @@
#ifndef HEADER_CURL_GSSAPI_STUBS_H
#define HEADER_CURL_GSSAPI_STUBS_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at https://curl.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* SPDX-License-Identifier: curl
*
***************************************************************************/
/* Roughly based on Heimdal's gssapi.h */
/* !checksrc! disable TYPEDEFSTRUCT all */
#include <stdint.h>
#include <stddef.h>
#define GSS_ERROR(status) (status & 0x80000000)
#define GSS_S_COMPLETE 0
#define GSS_S_FAILURE (0x80000000)
#define GSS_S_CONTINUE_NEEDED (1ul)
#define GSS_C_QOP_DEFAULT 0
#define GSS_C_NO_OID ((gss_OID) 0)
#define GSS_C_NO_NAME ((gss_name_t) 0)
#define GSS_C_NO_BUFFER ((gss_buffer_t) 0)
#define GSS_C_NO_CONTEXT ((gss_ctx_id_t) 0)
#define GSS_C_NO_CREDENTIAL ((gss_cred_id_t) 0)
#define GSS_C_NO_CHANNEL_BINDINGS ((gss_channel_bindings_t) 0)
#define GSS_C_NULL_OID GSS_C_NO_OID
#define GSS_C_EMPTY_BUFFER {0, NULL}
#define GSS_C_AF_INET 2
#define GSS_C_GSS_CODE 1
#define GSS_C_MECH_CODE 2
#define GSS_C_DELEG_FLAG 1
#define GSS_C_MUTUAL_FLAG 2
#define GSS_C_REPLAY_FLAG 4
#define GSS_C_CONF_FLAG 16
#define GSS_C_INTEG_FLAG 32
/*
* Expiration time of 2^32-1 seconds means infinite lifetime for a
* credential or security context
*/
#define GSS_C_INDEFINITE 0xfffffffful
#define GSS_C_NT_HOSTBASED_SERVICE NULL
typedef uint32_t OM_uint32;
typedef OM_uint32 gss_qop_t;
typedef struct gss_buffer_desc_struct {
size_t length;
void *value;
} gss_buffer_desc, *gss_buffer_t;
struct gss_cred_id_t_desc_struct;
typedef struct gss_cred_id_t_desc_struct *gss_cred_id_t;
typedef const struct gss_cred_id_t_desc_struct *gss_const_cred_id_t;
struct gss_ctx_id_t_desc_struct;
typedef struct gss_ctx_id_t_desc_struct *gss_ctx_id_t;
typedef const struct gss_ctx_id_t_desc_struct *gss_const_ctx_id_t;
struct gss_name_t_desc_struct;
typedef struct gss_name_t_desc_struct *gss_name_t;
typedef const struct gss_name_t_desc_struct *gss_const_name_t;
typedef struct gss_OID_desc_struct {
OM_uint32 length;
void *elements;
} gss_OID_desc, *gss_OID;
typedef struct gss_channel_bindings_struct {
OM_uint32 initiator_addrtype;
gss_buffer_desc initiator_address;
OM_uint32 acceptor_addrtype;
gss_buffer_desc acceptor_address;
gss_buffer_desc application_data;
} *gss_channel_bindings_t;
OM_uint32 gss_release_buffer(OM_uint32 * /* minor_status */,
gss_buffer_t /* buffer */);
OM_uint32 gss_init_sec_context(OM_uint32 * /* minor_status */,
gss_const_cred_id_t /* initiator_cred_handle */,
gss_ctx_id_t * /* context_handle */,
gss_const_name_t /* target_name */,
const gss_OID /* mech_type */,
OM_uint32 /* req_flags */,
OM_uint32 /* time_req */,
const gss_channel_bindings_t /* input_chan_bindings */,
const gss_buffer_t /* input_token */,
gss_OID * /* actual_mech_type */,
gss_buffer_t /* output_token */,
OM_uint32 * /* ret_flags */,
OM_uint32 * /* time_rec */);
OM_uint32 gss_delete_sec_context(OM_uint32 * /* minor_status */,
gss_ctx_id_t * /* context_handle */,
gss_buffer_t /* output_token */);
OM_uint32 gss_inquire_context(OM_uint32 * /* minor_status */,
gss_const_ctx_id_t /* context_handle */,
gss_name_t * /* src_name */,
gss_name_t * /* targ_name */,
OM_uint32 * /* lifetime_rec */,
gss_OID * /* mech_type */,
OM_uint32 * /* ctx_flags */,
int * /* locally_initiated */,
int * /* open_context */);
OM_uint32 gss_wrap(OM_uint32 * /* minor_status */,
gss_const_ctx_id_t /* context_handle */,
int /* conf_req_flag */,
gss_qop_t /* qop_req */,
const gss_buffer_t /* input_message_buffer */,
int * /* conf_state */,
gss_buffer_t /* output_message_buffer */);
OM_uint32 gss_unwrap(OM_uint32 * /* minor_status */,
gss_const_ctx_id_t /* context_handle */,
const gss_buffer_t /* input_message_buffer */,
gss_buffer_t /* output_message_buffer */,
int * /* conf_state */,
gss_qop_t * /* qop_state */);
OM_uint32 gss_seal(OM_uint32 * /* minor_status */,
gss_ctx_id_t /* context_handle n */,
int /* conf_req_flag */,
int /* qop_req */,
gss_buffer_t /* input_message_buffer */,
int * /* conf_state */,
gss_buffer_t /* output_message_buffer */);
OM_uint32 gss_unseal(OM_uint32 * /* minor_status */,
gss_ctx_id_t /* context_handle */,
gss_buffer_t /* input_message_buffer */,
gss_buffer_t /* output_message_buffer */,
int * /* conf_state */,
int * /* qop_state */);
OM_uint32 gss_import_name(OM_uint32 * /* minor_status */,
const gss_buffer_t /* input_name_buffer */,
const gss_OID /* input_name_type */,
gss_name_t * /* output_name */);
OM_uint32 gss_release_name(OM_uint32 * /* minor_status */,
gss_name_t * /* input_name */);
OM_uint32 gss_display_name(OM_uint32 * /* minor_status */,
gss_const_name_t /* input_name */,
gss_buffer_t /* output_name_buffer */,
gss_OID * /* output_name_type */);
OM_uint32 gss_display_status(OM_uint32 * /* minor_status */,
OM_uint32 /* status_value */,
int /* status_type */,
const gss_OID /* mech_type */,
OM_uint32 * /* message_context */,
gss_buffer_t /* status_string */);
#endif /* HEADER_CURL_GSSAPI_STUBS_H */

View file

@ -670,17 +670,6 @@ sub singletest_setenv {
if($content =~ /^=(.*)/) {
# assign it
$content = $1;
if($var =~ /^LD_PRELOAD/) {
if(exe_ext('TOOL') && (exe_ext('TOOL') eq '.exe')) {
logmsg "Skipping LD_PRELOAD due to lack of OS support\n" if($verbose);
next;
}
if($feature{"Debug"} || !$has_shared) {
logmsg "Skipping LD_PRELOAD due to no release shared build\n" if($verbose);
next;
}
}
$ENV{$var} = "$content";
logmsg "setenv $var = $content\n" if($verbose);
}
@ -688,7 +677,6 @@ sub singletest_setenv {
# remove it
delete $ENV{$var} if($ENV{$var});
}
}
}
if($proxy_address) {

View file

@ -545,10 +545,6 @@ sub checksystemfeatures {
$curl =~ s/^(.*)(libcurl.*)/$1/g || die "Failure determining curl binary version";
$libcurl = $2;
if($curl =~ /linux|bsd|solaris/i) {
# system supports LD_PRELOAD/LD_LIBRARY_PATH; may be disabled later
$feature{"ld_preload"} = 1;
}
if($curl =~ /win32|Windows|windows|mingw(32|64)/) {
# This is a Windows MinGW build or native build, we need to use
# Windows-style path.
@ -767,9 +763,6 @@ sub checksystemfeatures {
close($conf);
}
# allow this feature only if debug mode is disabled
$feature{"ld_preload"} = $feature{"ld_preload"} && !$feature{"Debug"};
if($feature{"IPv6"}) {
# client has IPv6 support
@ -823,11 +816,6 @@ sub checksystemfeatures {
}
# 'socks' was once here but is now removed
$has_shared = `sh $CURLCONFIG --built-shared`;
chomp $has_shared;
$has_shared = $has_shared eq "yes";
if($torture) {
if(!$feature{"TrackMemory"}) {
die "can't run torture tests since curl was built without ".