]> source.dussan.org Git - tigervnc.git/commitdiff
[Bugfix] Honor server security type order instead of client's when negotiating securi...
authorAdam Tkac <atkac@redhat.com>
Mon, 21 Feb 2011 12:55:24 +0000 (12:55 +0000)
committerAdam Tkac <atkac@redhat.com>
Mon, 21 Feb 2011 12:55:24 +0000 (12:55 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4300 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/rfb/CConnection.cxx

index cc68ea11a8a05f5a8a857c0f49950a098eae828e..04e3439bfbd9be12de0444b88c82918d92a9ef65 100644 (file)
@@ -157,24 +157,23 @@ void CConnection::processSecurityTypesMsg()
       throwConnFailedException();
 
     std::list<rdr::U8>::iterator j;
-    int secTypePos, secTypePosMin;
-
-    secTypePosMin = secTypes.size();
 
     for (int i = 0; i < nServerSecTypes; i++) {
       rdr::U8 serverSecType = is->readU8();
       vlog.debug("Server offers security type %s(%d)",
-                 secTypeName(serverSecType),serverSecType);
-
-      // We keep trying types, to find the one that matches and
-      // which appears first in the client's list of supported types.
-      for (j = secTypes.begin(), secTypePos = 0; j != secTypes.end(); j++, secTypePos++) {
-        if (*j == serverSecType && secTypePos < secTypePosMin) {
-          secType = *j;
-          secTypePosMin = secTypePos;
-          break;
-        }
-      }
+                 secTypeName(serverSecType), serverSecType);
+
+      /*
+       * Use the first type sent by server which matches client's type.
+       * It means server's order specifies priority.
+       */
+      if (secType == secTypeInvalid) {
+        for (j = secTypes.begin(); j != secTypes.end(); j++)
+          if (*j == serverSecType) {
+            secType = *j;
+            break;
+          }
+       }
     }
 
     // Inform the server of our decision