]> granicus.if.org Git - curl/commitdiff
sspi: Reworked Curl_sspi_version() to return version components
authorSteve Holme <steve_holme@hotmail.com>
Sun, 10 Jun 2012 11:07:45 +0000 (12:07 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 11 Jun 2012 17:00:36 +0000 (19:00 +0200)
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
lib/curl_sspi.c
lib/curl_sspi.h

index 7bca9034068456aeaad808eb753ee949a4d810fc..511f675e4768239d78d670983f85bafffade3e83 100644 (file)
@@ -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;
 }
 
index 29f8a436d2fa0f9039085e4e4a1585911dad6e99..71f087be760265c20c26c04f97964604953d1394 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2012, 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
@@ -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;
 }
 
 
index 1865ee490c0f861a8b4f145cc518f18e02c9edd6..38d31826f20713234a72cc50eee0427a0fdfa39e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2012, 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
@@ -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);