- name: 'Slackware openssl gssapi gcc'
# These are essentially the same flags used to build the curl Slackware package
# https://ftpmirror.infania.net/slackware/slackware64-current/source/n/curl/curl.SlackBuild
- configure: --with-openssl --with-libssh2 --with-gssapi --enable-ares --enable-static=no --without-ca-bundle --with-ca-path=/etc/ssl/certs
+ configure: --enable-debug --with-openssl --with-libssh2 --with-gssapi --enable-ares --enable-static=no --without-ca-bundle --with-ca-path=/etc/ssl/certs
# Docker Hub image that `container-job` executes in
container: 'andy5995/slackware-build-essential:15.0'
fi
if [[ "${MATRIX_INSTALL_PACKAGES}" = *'valgrind'* ]]; then
TFLAGS+=' -j6'
- fi
- if [[ "${MATRIX_INSTALL_PACKAGES}" = *'heimdal-dev'* ]]; then
- TFLAGS+=' ~2077 ~2078' # valgrind reporting memory leaks from Curl_auth_decode_spnego_message() -> gss_import_name()
+ if [[ "${MATRIX_INSTALL_PACKAGES}" = *'heimdal-dev'* ]]; then
+ TFLAGS+=' ~2056 ~2057 ~2077 ~2078' # memory leaks from Curl_auth_decode_spnego_message() -> gss_import_name()
+ fi
fi
fi
[ -x ~/venv/bin/activate ] && source ~/venv/bin/activate
generate: -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/quictls -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON
- name: 'LibreSSL !ldap heimdal c-ares +examples'
install: libressl heimdal
- generate: -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/libressl -DENABLE_ARES=ON -DCURL_USE_GSSAPI=ON -DGSS_ROOT_DIR=/opt/homebrew/opt/heimdal -DCURL_DISABLE_LDAP=ON
+ generate: -DENABLE_DEBUG=ON -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/libressl -DENABLE_ARES=ON -DCURL_USE_GSSAPI=ON -DGSS_ROOT_DIR=/opt/homebrew/opt/heimdal -DCURL_DISABLE_LDAP=ON
- name: 'wolfSSL !ldap brotli zstd'
install: brotli wolfssl zstd
install_steps: pytest
generate: -DCURL_USE_MBEDTLS=ON -DLDAP_INCLUDE_DIR=/opt/homebrew/opt/openldap/include -DLDAP_LIBRARY=/opt/homebrew/opt/openldap/lib/libldap.dylib -DLDAP_LBER_LIBRARY=/opt/homebrew/opt/openldap/lib/liblber.dylib
- name: 'GnuTLS !ldap krb5'
install: gnutls nettle krb5
- generate: -DCURL_USE_GNUTLS=ON -DCURL_USE_OPENSSL=OFF -DCURL_USE_GSSAPI=ON -DGSS_ROOT_DIR=/opt/homebrew/opt/krb5 -DCURL_DISABLE_LDAP=ON -DUSE_SSLS_EXPORT=ON
+ generate: -DENABLE_DEBUG=ON -DCURL_USE_GNUTLS=ON -DCURL_USE_OPENSSL=OFF -DCURL_USE_GSSAPI=ON -DGSS_ROOT_DIR=/opt/homebrew/opt/krb5 -DCURL_DISABLE_LDAP=ON -DUSE_SSLS_EXPORT=ON
- name: 'OpenSSL torture !FTP'
generate: -DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DENABLE_THREADED_RESOLVER=OFF -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl
tflags: -t --shallow=25 !FTP
- `Largefile`
- `large-time` (time_t is larger than 32-bit)
- `large-size` (size_t is larger than 32-bit)
-- `ld_preload`
- `libssh2`
- `libssh`
- `oldlibssh` (versions before 0.9.4)
9, CURL_UNCONST("\x2a\x86\x48\x86\xf7\x12\x01\x02\x02")
};
-OM_uint32 Curl_gss_init_sec_context(
- struct Curl_easy *data,
- OM_uint32 *minor_status,
- gss_ctx_id_t *context,
- gss_name_t target_name,
- gss_OID mech_type,
- gss_channel_bindings_t input_chan_bindings,
- gss_buffer_t input_token,
- gss_buffer_t output_token,
- const bool mutual_auth,
- OM_uint32 *ret_flags)
+#ifdef DEBUGBUILD
+enum min_err_code {
+ STUB_GSS_OK = 0,
+ STUB_GSS_NO_MEMORY,
+ STUB_GSS_INVALID_ARGS,
+ STUB_GSS_INVALID_CREDS,
+ STUB_GSS_INVALID_CTX,
+ STUB_GSS_SERVER_ERR,
+ STUB_GSS_NO_MECH,
+ STUB_GSS_LAST
+};
+
+/* libcurl is also passing this struct to these functions, which are not yet
+ * stubbed:
+ * gss_inquire_context()
+ * gss_unwrap()
+ * gss_wrap()
+ */
+struct stub_gss_ctx_id_t_desc {
+ enum { STUB_GSS_NONE, STUB_GSS_KRB5, STUB_GSS_NTLM1, STUB_GSS_NTLM3 } sent;
+ int have_krb5;
+ int have_ntlm;
+ OM_uint32 flags;
+ char creds[250];
+};
+
+static OM_uint32
+stub_gss_init_sec_context(OM_uint32 *min,
+ gss_cred_id_t initiator_cred_handle,
+ struct stub_gss_ctx_id_t_desc **context,
+ gss_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,
+ gss_buffer_desc *input_token,
+ gss_OID *actual_mech_type,
+ gss_buffer_desc *output_token,
+ OM_uint32 *ret_flags,
+ OM_uint32 *time_rec)
+{
+ struct stub_gss_ctx_id_t_desc *ctx = NULL;
+
+ /* The token will be encoded in base64 */
+ size_t length = sizeof(ctx->creds) * 3 / 4;
+ size_t used = 0;
+ char *token = NULL;
+ const char *creds = 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 || !target_name || !output_token) {
+ *min = STUB_GSS_INVALID_ARGS;
+ return GSS_S_FAILURE;
+ }
+
+ creds = getenv("CURL_STUB_GSS_CREDS");
+ if(!creds || strlen(creds) >= sizeof(ctx->creds)) {
+ *min = STUB_GSS_INVALID_CREDS;
+ return GSS_S_FAILURE;
+ }
+
+ ctx = *context;
+ if(ctx && strcmp(ctx->creds, creds)) {
+ *min = STUB_GSS_INVALID_CREDS;
+ return GSS_S_FAILURE;
+ }
+
+ output_token->length = 0;
+ output_token->value = NULL;
+
+ if(input_token && input_token->length) {
+ if(!ctx) {
+ *min = STUB_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 STUB_GSS_KRB5:
+ case STUB_GSS_NTLM3:
+ if(ret_flags)
+ *ret_flags = ctx->flags;
+ if(time_rec)
+ *time_rec = GSS_C_INDEFINITE;
+ return GSS_S_COMPLETE;
+ default:
+ *min = STUB_GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+ }
+
+ if(((char *) input_token->value)[0] != 'C') {
+ /* We only support Done or Continue */
+ *min = STUB_GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+
+ /* Continue */
+ switch(ctx->sent) {
+ case STUB_GSS_KRB5:
+ /* We sent KRB5 and it failed, let's try NTLM */
+ if(ctx->have_ntlm) {
+ ctx->sent = STUB_GSS_NTLM1;
+ break;
+ }
+ else {
+ *min = STUB_GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+ case STUB_GSS_NTLM1:
+ ctx->sent = STUB_GSS_NTLM3;
+ break;
+ default:
+ *min = STUB_GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+ }
+ else {
+ if(ctx) {
+ *min = STUB_GSS_INVALID_CTX;
+ return GSS_S_FAILURE;
+ }
+
+ ctx = calloc(1, sizeof(*ctx));
+ if(!ctx) {
+ *min = STUB_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 = STUB_GSS_KRB5;
+ else if(ctx->have_ntlm)
+ ctx->sent = STUB_GSS_NTLM1;
+ else {
+ free(ctx);
+ *min = STUB_GSS_NO_MECH;
+ return GSS_S_FAILURE;
+ }
+
+ strcpy(ctx->creds, creds);
+ ctx->flags = req_flags;
+ }
+
+ /* To avoid memdebug macro replacement, wrap the name in parentheses to call
+ the original version. It is freed via the GSS API gss_release_buffer(). */
+ token = (malloc)(length);
+ if(!token) {
+ free(ctx);
+ *min = STUB_GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ {
+ gss_buffer_desc target_desc;
+ gss_OID name_type = GSS_C_NO_OID;
+ OM_uint32 minor_status;
+ OM_uint32 major_status;
+ major_status = gss_display_name(&minor_status, target_name,
+ &target_desc, &name_type);
+ if(GSS_ERROR(major_status)) {
+ (free)(token);
+ free(ctx);
+ *min = STUB_GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ if(strlen(creds) + target_desc.length + 5 >= sizeof(ctx->creds)) {
+ (free)(token);
+ free(ctx);
+ *min = STUB_GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ /* Token format: creds:target:type:padding */
+ used = msnprintf(token, length, "%s:%.*s:%d:", creds,
+ (int)target_desc.length, (const char *)target_desc.value,
+ ctx->sent);
+
+ gss_release_buffer(&minor_status, &target_desc);
+ }
+
+ if(used >= length) {
+ (free)(token);
+ free(ctx);
+ *min = STUB_GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ /* Overwrite null-terminator */
+ memset(token + used, 'A', length - used);
+
+ *context = ctx;
+
+ output_token->value = token;
+ output_token->length = length;
+
+ return GSS_S_CONTINUE_NEEDED;
+}
+
+static OM_uint32
+stub_gss_delete_sec_context(OM_uint32 *min,
+ struct stub_gss_ctx_id_t_desc **context,
+ gss_buffer_t output_token)
+{
+ (void)output_token;
+
+ if(!min)
+ return GSS_S_FAILURE;
+
+ if(!context) {
+ *min = STUB_GSS_INVALID_CTX;
+ return GSS_S_FAILURE;
+ }
+ if(!*context) {
+ *min = STUB_GSS_INVALID_CTX;
+ return GSS_S_FAILURE;
+ }
+
+ free(*context);
+ *context = NULL;
+ *min = 0;
+
+ return GSS_S_COMPLETE;
+}
+#endif /* DEBUGBUILD */
+
+OM_uint32 Curl_gss_init_sec_context(struct Curl_easy *data,
+ OM_uint32 *minor_status,
+ gss_ctx_id_t *context,
+ gss_name_t target_name,
+ gss_OID mech_type,
+ gss_channel_bindings_t input_chan_bindings,
+ gss_buffer_t input_token,
+ gss_buffer_t output_token,
+ const bool mutual_auth,
+ OM_uint32 *ret_flags)
{
OM_uint32 req_flags = GSS_C_REPLAY_FLAG;
req_flags |= GSS_C_DELEG_POLICY_FLAG;
#else
infof(data, "WARNING: support for CURLGSSAPI_DELEGATION_POLICY_FLAG not "
- "compiled in");
+ "compiled in");
#endif
}
if(data->set.gssapi_delegation & CURLGSSAPI_DELEGATION_FLAG)
req_flags |= GSS_C_DELEG_FLAG;
+#ifdef DEBUGBUILD
+ if(getenv("CURL_STUB_GSS_CREDS"))
+ return stub_gss_init_sec_context(minor_status,
+ GSS_C_NO_CREDENTIAL, /* cred_handle */
+ (struct stub_gss_ctx_id_t_desc **)context,
+ target_name,
+ mech_type,
+ req_flags,
+ 0, /* time_req */
+ input_chan_bindings,
+ input_token,
+ NULL, /* actual_mech_type */
+ output_token,
+ ret_flags,
+ NULL /* time_rec */);
+#endif /* DEBUGBUILD */
+
return gss_init_sec_context(minor_status,
GSS_C_NO_CREDENTIAL, /* cred_handle */
context,
NULL /* time_rec */);
}
+OM_uint32 Curl_gss_delete_sec_context(OM_uint32 *min,
+ gss_ctx_id_t *context,
+ gss_buffer_t output_token)
+{
+#ifdef DEBUGBUILD
+ if(getenv("CURL_STUB_GSS_CREDS"))
+ return stub_gss_delete_sec_context(min,
+ (struct stub_gss_ctx_id_t_desc **)context,
+ output_token);
+#endif /* DEBUGBUILD */
+
+ return gss_delete_sec_context(min, context, output_token);
+}
+
#define GSS_LOG_BUFFER_LEN 1024
static size_t display_gss_error(OM_uint32 status, int type,
char *buf, size_t len) {
extern gss_OID_desc Curl_krb5_mech_oid;
/* Common method for using GSS-API */
-OM_uint32 Curl_gss_init_sec_context(
- struct Curl_easy *data,
- OM_uint32 *minor_status,
- gss_ctx_id_t *context,
- gss_name_t target_name,
- gss_OID mech_type,
- gss_channel_bindings_t input_chan_bindings,
- gss_buffer_t input_token,
- gss_buffer_t output_token,
- const bool mutual_auth,
- OM_uint32 *ret_flags);
+OM_uint32 Curl_gss_init_sec_context(struct Curl_easy *data,
+ OM_uint32 *minor_status,
+ gss_ctx_id_t *context,
+ gss_name_t target_name,
+ gss_OID mech_type,
+ gss_channel_bindings_t input_chan_bindings,
+ gss_buffer_t input_token,
+ gss_buffer_t output_token,
+ const bool mutual_auth,
+ OM_uint32 *ret_flags);
+
+OM_uint32 Curl_gss_delete_sec_context(OM_uint32 *min,
+ gss_ctx_id_t *context_handle,
+ gss_buffer_t output_token);
/* Helper to log a GSS-API error status */
void Curl_gss_log_error(struct Curl_easy *data, const char *prefix,
OM_uint32 min;
gss_ctx_id_t *context = app_data;
if(*context != GSS_C_NO_CONTEXT) {
- OM_uint32 maj = gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
+ OM_uint32 maj = Curl_gss_delete_sec_context(&min, context,
+ GSS_C_NO_BUFFER);
(void)maj;
DEBUGASSERT(maj == GSS_S_COMPLETE);
}
gss_release_name(&gss_status, &server);
gss_release_buffer(&gss_status, &gss_recv_token);
gss_release_buffer(&gss_status, &gss_send_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
failf(data, "Failed to initial GSS-API token.");
return CURLE_COULDNT_CONNECT;
}
gss_release_name(&gss_status, &server);
gss_release_buffer(&gss_status, &gss_recv_token);
gss_release_buffer(&gss_status, &gss_send_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
gss_release_name(&gss_status, &server);
gss_release_buffer(&gss_status, &gss_recv_token);
gss_release_buffer(&gss_status, &gss_send_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
if(result || (actualread != 4)) {
failf(data, "Failed to receive GSS-API authentication response.");
gss_release_name(&gss_status, &server);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
failf(data, "User was rejected by the SOCKS5 server (%d %d).",
socksreq[0], socksreq[1]);
gss_release_name(&gss_status, &server);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
failf(data, "Invalid GSS-API authentication response type (%d %d).",
socksreq[0], socksreq[1]);
gss_release_name(&gss_status, &server);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
"Could not allocate memory for GSS-API authentication "
"response token.");
gss_release_name(&gss_status, &server);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_OUT_OF_MEMORY;
}
failf(data, "Failed to receive GSS-API authentication token.");
gss_release_name(&gss_status, &server);
gss_release_buffer(&gss_status, &gss_recv_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
NULL, NULL, NULL);
if(check_gss_err(data, gss_major_status,
gss_minor_status, "gss_inquire_context")) {
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
gss_release_name(&gss_status, &gss_client_name);
failf(data, "Failed to determine username.");
return CURLE_COULDNT_CONNECT;
&gss_send_token, NULL);
if(check_gss_err(data, gss_major_status,
gss_minor_status, "gss_display_name")) {
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
gss_release_name(&gss_status, &gss_client_name);
gss_release_buffer(&gss_status, &gss_send_token);
failf(data, "Failed to determine username.");
}
user = malloc(gss_send_token.length + 1);
if(!user) {
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
gss_release_name(&gss_status, &gss_client_name);
gss_release_buffer(&gss_status, &gss_send_token);
return CURLE_OUT_OF_MEMORY;
gss_send_token.length = 1;
gss_send_token.value = Curl_memdup(&gss_enc, 1);
if(!gss_send_token.value) {
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_OUT_OF_MEMORY;
}
if(check_gss_err(data, gss_major_status, gss_minor_status, "gss_wrap")) {
gss_release_buffer(&gss_status, &gss_send_token);
gss_release_buffer(&gss_status, &gss_w_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
failf(data, "Failed to wrap GSS-API encryption value into token.");
return CURLE_COULDNT_CONNECT;
}
if(code || (4 != nwritten)) {
failf(data, "Failed to send GSS-API encryption request.");
gss_release_buffer(&gss_status, &gss_w_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
&nwritten);
if(code || ( 1 != nwritten)) {
failf(data, "Failed to send GSS-API encryption type.");
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
}
if(code || (gss_w_token.length != nwritten)) {
failf(data, "Failed to send GSS-API encryption type.");
gss_release_buffer(&gss_status, &gss_w_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
gss_release_buffer(&gss_status, &gss_w_token);
result = Curl_blockread_all(cf, data, (char *)socksreq, 4, &actualread);
if(result || (actualread != 4)) {
failf(data, "Failed to receive GSS-API encryption response.");
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
if(socksreq[1] == 255) { /* status / message type */
failf(data, "User was rejected by the SOCKS5 server (%d %d).",
socksreq[0], socksreq[1]);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
if(socksreq[1] != 2) { /* status / message type */
failf(data, "Invalid GSS-API encryption response type (%d %d).",
socksreq[0], socksreq[1]);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
gss_recv_token.length = us_length;
gss_recv_token.value = malloc(gss_recv_token.length);
if(!gss_recv_token.value) {
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_OUT_OF_MEMORY;
}
result = Curl_blockread_all(cf, data, (char *)gss_recv_token.value,
if(result || (actualread != us_length)) {
failf(data, "Failed to receive GSS-API encryption type.");
gss_release_buffer(&gss_status, &gss_recv_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
if(check_gss_err(data, gss_major_status, gss_minor_status, "gss_unwrap")) {
gss_release_buffer(&gss_status, &gss_recv_token);
gss_release_buffer(&gss_status, &gss_w_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
failf(data, "Failed to unwrap GSS-API encryption value into token.");
return CURLE_COULDNT_CONNECT;
}
failf(data, "Invalid GSS-API encryption response length (%zu).",
gss_w_token.length);
gss_release_buffer(&gss_status, &gss_w_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
failf(data, "Invalid GSS-API encryption response length (%zu).",
gss_recv_token.length);
gss_release_buffer(&gss_status, &gss_recv_token);
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_COULDNT_CONNECT;
}
conn->socks5_gssapi_enctype = socksreq[0];
if(socksreq[0] == 0)
- gss_delete_sec_context(&gss_status, &gss_context, NULL);
+ Curl_gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_OK;
}
OM_uint32 major_status;
OM_uint32 minor_status;
OM_uint32 unused_status;
- gss_buffer_desc spn_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
(void) passwdp;
if(!krb5->spn) {
+ gss_buffer_desc spn_token = GSS_C_EMPTY_BUFFER;
+
/* Generate our SPN */
char *spn = Curl_auth_build_spn(service, NULL, host);
if(!spn)
/* Free our security context */
if(krb5->context != GSS_C_NO_CONTEXT) {
- gss_delete_sec_context(&minor_status, &krb5->context, GSS_C_NO_BUFFER);
+ Curl_gss_delete_sec_context(&minor_status, &krb5->context,
+ GSS_C_NO_BUFFER);
krb5->context = GSS_C_NO_CONTEXT;
}
OM_uint32 major_status;
OM_uint32 minor_status;
OM_uint32 unused_status;
- gss_buffer_desc spn_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
gss_channel_bindings_t chan_bindings = GSS_C_NO_CHANNEL_BINDINGS;
}
if(!nego->spn) {
+ gss_buffer_desc spn_token = GSS_C_EMPTY_BUFFER;
+
/* Generate our SPN */
char *spn = Curl_auth_build_spn(service, NULL, host);
if(!spn)
/* Free our security context */
if(nego->context != GSS_C_NO_CONTEXT) {
- gss_delete_sec_context(&minor_status, &nego->context, GSS_C_NO_BUFFER);
+ Curl_gss_delete_sec_context(&minor_status, &nego->context,
+ GSS_C_NO_BUFFER);
nego->context = GSS_C_NO_CONTEXT;
}
gss_release_buffer(&minor_status, &nego->output_token);
nego->output_token.value = NULL;
nego->output_token.length = 0;
-
}
/* Free the SPN */
</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>
</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>
$CURLVERSION
$CURLVERNUM
$DATE
- $has_shared
$LIBDIR
$UNITDIR
$TUNITDIR
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;
#
###########################################################################
-# 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")
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()
-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) \
# 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
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
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
+++ /dev/null
-/***************************************************************************
- * _ _ ____ _
- * 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;
-}
+++ /dev/null
-#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 */
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);
}
# remove it
delete $ENV{$var} if($ENV{$var});
}
-
}
}
if($proxy_address) {
$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.
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
}
# '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 ".