Author: rfm
Date: Fri Jul 25 14:06:34 2014
New Revision: 38015

URL: http://svn.gna.org/viewcvs/gnustep?rev=38015&view=rev
Log:
TLS fixups

Added:
    libs/base/trunk/Tests/base/NSURLConnection/test01.m
Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/GSSocketStream.m
    libs/base/trunk/Source/GSTLS.m
    libs/base/trunk/Source/NSData.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=38015&r1=38014&r2=38015&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Fri Jul 25 14:06:34 2014
@@ -1,3 +1,11 @@
+2014-07-25  Richard Frith-Macdonald <[email protected]>
+
+       * Source/GSSocketStream.m: Fix handling TLS handshake in the case
+       where there is a network failure during the handshake (bug#42781).
+       * Source/GSTLS.m: Fix erroneous attempt to load revocation lists.
+       * Tests/base/NSURLConnection/test01.m: https test contributed by
+       Sergei Golovin.
+
 2014-07-25  Richard Frith-Macdonald <[email protected]>
 
         * configure.ac: Remove compiler charset options

Modified: libs/base/trunk/Source/GSSocketStream.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSSocketStream.m?rev=38015&r1=38014&r2=38015&view=diff
==============================================================================
--- libs/base/trunk/Source/GSSocketStream.m     (original)
+++ libs/base/trunk/Source/GSSocketStream.m     Fri Jul 25 14:06:34 2014
@@ -628,37 +628,47 @@
           case NSStreamEventHasSpaceAvailable:
           case NSStreamEventHasBytesAvailable:
           case NSStreamEventOpenCompleted:
-            [self hello]; /* try to complete the handshake */
-            if (handshake == NO)
-              {
-                NSDebugMLLog(@"NSStream",
-                  @"GSTLSHandler completed on %p", stream);
-                if ([istream streamStatus] == NSStreamStatusOpen)
-                  {
-                   [istream _resetEvents: NSStreamEventOpenCompleted];
-                    [istream _sendEvent: NSStreamEventOpenCompleted];
-                  }
-                else
-                  {
-                   [istream _resetEvents: NSStreamEventErrorOccurred];
-                    [istream _sendEvent: NSStreamEventErrorOccurred];
-                  }
-                if ([ostream streamStatus]  == NSStreamStatusOpen)
-                  {
-                   [ostream _resetEvents: NSStreamEventOpenCompleted
-                     | NSStreamEventHasSpaceAvailable];
-                    [ostream _sendEvent: NSStreamEventOpenCompleted];
-                    [ostream _sendEvent: NSStreamEventHasSpaceAvailable];
-                  }
-                else
-                  {
-                   [ostream _resetEvents: NSStreamEventErrorOccurred];
-                    [ostream _sendEvent: NSStreamEventErrorOccurred];
-                  }
-              }
+            /* try to complete the handshake.
+             */
+            [self hello];
             break;
+
+          case NSStreamEventErrorOccurred:
+          case NSStreamEventEndEncountered:
+            /* stream error or close ... handshake fails.
+             */
+            handshake = NO;
+            break;
+
           default:
             break;
+        }
+      if (NO == handshake)
+        {
+          NSDebugMLLog(@"NSStream",
+            @"GSTLSHandler completed on %p", stream);
+          if ([istream streamStatus] == NSStreamStatusOpen)
+            {
+              [istream _resetEvents: NSStreamEventOpenCompleted];
+              [istream _sendEvent: NSStreamEventOpenCompleted];
+            }
+          else
+            {
+              [istream _resetEvents: NSStreamEventErrorOccurred];
+              [istream _sendEvent: NSStreamEventErrorOccurred];
+            }
+          if ([ostream streamStatus] == NSStreamStatusOpen)
+            {
+              [ostream _resetEvents: NSStreamEventOpenCompleted
+                | NSStreamEventHasSpaceAvailable];
+              [ostream _sendEvent: NSStreamEventOpenCompleted];
+              [ostream _sendEvent: NSStreamEventHasSpaceAvailable];
+            }
+          else
+            {
+              [ostream _resetEvents: NSStreamEventErrorOccurred];
+              [ostream _sendEvent: NSStreamEventErrorOccurred];
+            }
         }
     }
 }

Modified: libs/base/trunk/Source/GSTLS.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSTLS.m?rev=38015&r1=38014&r2=38015&view=diff
==============================================================================
--- libs/base/trunk/Source/GSTLS.m      (original)
+++ libs/base/trunk/Source/GSTLS.m      Fri Jul 25 14:06:34 2014
@@ -57,6 +57,10 @@
 static NSString *
 standardizedPath(NSString *path)
 {
+  if (0 == [path length])
+    {
+      return nil;       // Not a path
+    }
   if (NO == [path isAbsolutePath])
     {
       path = [[[NSFileManager defaultManager] currentDirectoryPath]
@@ -188,9 +192,9 @@
    * GS_TLS_CA_FILE environment variable.
    */
   str = [[NSUserDefaults standardUserDefaults] stringForKey: GSTLSCAFile];
+  str = standardizedPath(str);
   if (nil != str)
     {
-      str = standardizedPath(str);
       ASSIGN(caFile, str);
     }
 
@@ -198,9 +202,9 @@
    * GS_TLS_REVOKE environment variable.
    */
   str = [[NSUserDefaults standardUserDefaults] stringForKey: GSTLSRevokeFile];
+  str = standardizedPath(str);
   if (nil != str)
     {
-      str = standardizedPath(str);
       ASSIGN(revokeFile, str);
     }
 
@@ -1133,7 +1137,7 @@
             path, GNUTLS_X509_FMT_PEM);
           if (ret < 0)
             {
-              NSLog(@"Problem loading revocation list from %@: %s",
+              NSLog(@"Problem loading default revocation list from %@: %s",
                 drv, gnutls_strerror(ret));
             }
           else

Modified: libs/base/trunk/Source/NSData.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSData.m?rev=38015&r1=38014&r2=38015&view=diff
==============================================================================
--- libs/base/trunk/Source/NSData.m     (original)
+++ libs/base/trunk/Source/NSData.m     Fri Jul 25 14:06:34 2014
@@ -150,11 +150,7 @@
   FILE         *theFile = 0;
   void         *tmp = 0;
   int          c;
-#if defined(__MINGW__)
-  long         fileLength;
-#else
   off_t        fileLength;
-#endif
        
 #if defined(__MINGW__)
   thePath = (const unichar*)[path fileSystemRepresentation];
@@ -182,11 +178,7 @@
   /*
    *   Seek to the end of the file.
    */
-#if defined(__MINGW__)
-  c = fseek(theFile, 0L, SEEK_END);
-#else
   c = fseeko(theFile, 0, SEEK_END);
-#endif
   if (c != 0)
     {
       NSWarnFLog(@"Seek to end of file (%@) failed - %@", path,
@@ -198,13 +190,8 @@
    *   Determine the length of the file (having seeked to the end of the
    *   file) by calling ftello().
    */
-#if defined(__MINGW__)
-  fileLength = ftell(theFile);
-  if (fileLength == -1)
-#else
   fileLength = ftello(theFile);
   if (fileLength == (off_t) -1)
-#endif
     {
       NSWarnFLog(@"Ftell on %@ failed - %@", path, [NSError _last]);
       goto failure;
@@ -214,11 +201,7 @@
    *   Rewind the file pointer to the beginning, preparing to read in
    *   the file.
    */
-#if defined(__MINGW__)
-  c = fseek(theFile, 0L, SEEK_SET);
-#else
   c = fseeko(theFile, 0, SEEK_SET);
-#endif
   if (c != 0)
     {
       NSWarnFLog(@"Fseek to start of file (%@) failed - %@", path,

Added: libs/base/trunk/Tests/base/NSURLConnection/test01.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Tests/base/NSURLConnection/test01.m?rev=38015&view=auto
==============================================================================
--- libs/base/trunk/Tests/base/NSURLConnection/test01.m (added)
+++ libs/base/trunk/Tests/base/NSURLConnection/test01.m Fri Jul 25 14:06:34 2014
@@ -0,0 +1,95 @@
+/**
+ *  The test makes connections to not-listening services.
+ *  One for HTTP and one for HTTPS.
+ *  The NSURLConnection delegate is supposed to catch an
+ *  error in that two cases and sets it's ivars accordingly.
+ */
+
+#import <Foundation/Foundation.h>
+#import "Testing.h"
+
+@interface Delegate : NSObject
+{
+  BOOL _done;
+  NSError *_error;
+}
+- (void) reset;
+- (NSError *) error;
+- (BOOL) done;
+- (void) connection: (NSURLConnection *)connection
+   didFailWithError: (NSError *)error;
+@end
+
+@implementation Delegate
+
+- (void) reset
+{
+  _done = NO;
+  _error = nil;
+}
+
+- (NSError *) error
+{
+  return _error;
+}
+
+- (BOOL) done
+{
+  return _done;
+}
+
+- (void) connection: (NSURLConnection *)connection
+   didFailWithError: (NSError *)error
+{
+  _error = error;
+  _done = YES;
+}
+
+@end
+
+int main(int argc, char **argv, char **env)
+{
+  NSAutoreleasePool *arp = [NSAutoreleasePool new];
+  NSTimeInterval timing;
+  NSTimeInterval duration;
+
+  NSString *urlString;
+  NSURLRequest *req;
+  Delegate *del;
+
+  duration = 0.0;
+  timing = 0.1;
+  urlString = @"http://127.0.0.1:19750";;
+  req = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]];
+  del = [[Delegate new] autorelease];
+  [del reset];
+  [NSURLConnection connectionWithRequest: req
+                               delegate: del];
+  while (![del done] && duration < 3.0)
+    {
+      [[NSRunLoop currentRunLoop]
+        runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]];
+      duration += timing;
+    }
+  PASS([del done] && nil != [del error],
+    "connection to dead(not-listening) HTTP service");
+
+  duration = 0.0;
+  urlString = @"https://127.0.0.1:19750";;
+  req = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]];
+  [NSURLConnection connectionWithRequest: req
+                               delegate: del];
+  [del reset];
+  while (![del done] && duration < 3.0)
+    {
+      [[NSRunLoop currentRunLoop]
+        runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]];
+      duration += timing;
+    }
+  PASS([del done] && nil != [del error],
+    "connection to dead(not-listening) HTTPS service");
+
+  [arp release]; arp = nil;
+
+  return 0;
+}


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to