From bd38ebc6975f5de2ed6ac33ade46e92356d77966 Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Sun, 10 Jun 2012 12:07:45 +0100 Subject: [PATCH] sspi: Reworked Curl_sspi_version() to return version components Reworked the version function to return four version components rather than a string that has to be freed by the caller. --- lib/curl_schannel.c | 11 +++++-- lib/curl_sspi.c | 77 ++++++++++++++++++++++++++------------------- lib/curl_sspi.h | 4 +-- 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/lib/curl_schannel.c b/lib/curl_schannel.c index 7bca90340..511f675e4 100644 --- a/lib/curl_schannel.c +++ b/lib/curl_schannel.c @@ -974,9 +974,14 @@ void Curl_schannel_cleanup() size_t Curl_schannel_version(char *buffer, size_t size) { - char *version = Curl_sspi_version(); - size = snprintf(buffer, size, "Schannel/%s", version); - free(version); + int sspi_major = 0, sspi_minor = 0, sspi_build = 0; + + if(!Curl_sspi_version(&sspi_major, &sspi_minor, &sspi_build, NULL)) + size = snprintf(buffer, size, "WinSSPI/%d.%d.%d", sspi_major, sspi_minor, + sspi_build); + else + size = snprintf(buffer, size, "WinSSPI/unknown"); + return size; } diff --git a/lib/curl_sspi.c b/lib/curl_sspi.c index 29f8a436d..71f087be7 100644 --- a/lib/curl_sspi.c +++ b/lib/curl_sspi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -122,50 +122,63 @@ Curl_sspi_global_cleanup(void) /* * Curl_sspi_version() * - * This function returns a string representing the SSPI library version. - * It will in any case return a usable string pointer which needs to be freed. + * This function returns the SSPI library version information. */ -char * -Curl_sspi_version() +CURLcode Curl_sspi_version(int *major, int *minor, int *build, int *special) { + CURLcode result = CURLE_OK; VS_FIXEDFILEINFO *version_info = NULL; - LPTSTR version = NULL; LPTSTR path = NULL; LPVOID data = NULL; DWORD size, handle; - UINT length; - if(s_hSecDll) { - path = malloc(MAX_PATH); - if(path) { - if(GetModuleFileName(s_hSecDll, path, MAX_PATH)) { - size = GetFileVersionInfoSize(path, &handle); - if(size) { - data = malloc(size); - if(data) { - if(GetFileVersionInfo(path, handle, size, data)) { - if(VerQueryValue(data, "\\", (LPVOID*)&version_info, &length)) { - version = curl_maprintf("%d.%d.%d.%d", - (version_info->dwProductVersionMS>>16)&0xffff, - (version_info->dwProductVersionMS>>0)&0xffff, - (version_info->dwProductVersionLS>>16)&0xffff, - (version_info->dwProductVersionLS>>0)&0xffff); - } - } - free(data); - } + if(!s_hSecDll) + return CURLE_FAILED_INIT; + + path = (char *) malloc(MAX_PATH); + if(!path) + return CURLE_OUT_OF_MEMORY; + + if(GetModuleFileName(s_hSecDll, path, MAX_PATH)) { + size = GetFileVersionInfoSize(path, &handle); + if(size) { + data = malloc(size); + if(data) { + if(GetFileVersionInfo(path, handle, size, data)) { + if(!VerQueryValue(data, "\\", &version_info, &handle)) + result = CURLE_OUT_OF_MEMORY; } + else + result = CURLE_OUT_OF_MEMORY; } - free(path); + else + result = CURLE_OUT_OF_MEMORY; } - if(!version) - version = curl_maprintf("%d", s_pSecFn ? s_pSecFn->dwVersion : 0); + else + result = CURLE_OUT_OF_MEMORY; + } + else + result = CURLE_OUT_OF_MEMORY; + + /* Set the out parameters */ + if(!result) { + if(major) + *major = (version_info->dwProductVersionMS >> 16) & 0xffff; + + if(minor) + *minor = (version_info->dwProductVersionMS >> 0) & 0xffff; + + if(build) + *build = (version_info->dwProductVersionLS >> 16) & 0xffff; + + if(special) + *special = (version_info->dwProductVersionLS >> 0) & 0xffff; } - if(!version) - version = strdup(""); + Curl_safefree(data); + Curl_safefree(path); - return version; + return result; } diff --git a/lib/curl_sspi.h b/lib/curl_sspi.h index 1865ee490..38d31826f 100644 --- a/lib/curl_sspi.h +++ b/lib/curl_sspi.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -63,7 +63,7 @@ CURLcode Curl_sspi_global_init(void); void Curl_sspi_global_cleanup(void); -char* Curl_sspi_version(); +CURLcode Curl_sspi_version(int *major, int *minor, int *build, int *special); char* Curl_sspi_status(SECURITY_STATUS status); char* Curl_sspi_status_msg(SECURITY_STATUS status);