]> err.no Git - sope/commitdiff
fixed some crash situation with OGo bug #883
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 7 Sep 2004 14:46:21 +0000 (14:46 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 7 Sep 2004 14:46:21 +0000 (14:46 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@117 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/NGObjWeb/WODirectAction.h
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WOContext.m
sope-appserver/mod_ngobjweb/README
sope-mime/ChangeLog
sope-mime/NGImap4/ChangeLog
sope-mime/NGImap4/NGImap4ResponseParser.m
sope-mime/Version

index a155f43ee86da3ed696902b7ea896a9e86010ebe..f983d9c5e83c48ec1e356d6ce4e9e7291885c753 100644 (file)
@@ -1,3 +1,7 @@
+2004-09-07  Helge Hess  <helge.hess@skyrix.com>
+       
+       * WOContext.m: minor code cleanup (v4.3.28)
+       
 2004-09-06  Helge Hess  <helge.hess@skyrix.com>
 
        * Defaults.plist: enable watch dog per default (use WOUseWatchDog
index d831800fd3ed1222701941c565a1cf77e269f933..51adf20d823c807c8567ed18f36b7dc3fb8e0778 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGObjWeb_WODirectAction_H__
 #define __NGObjWeb_WODirectAction_H__
index 03bdd30f7e66ba0c5523794990dd1b23a1a3245c..7f7310206882af73ae42174761c2d36688239589 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=27
+SUBMINOR_VERSION:=28
 
 # v4.2.413 requires libSaxObjC      v4.2.33
 # v4.2.341 requires libNGExtensions v4.2.77
index f6b077450e6a3d38760517e422e32343609c8308..19e1f15c42bff2ebf8f483f904430a99b3c6ea0f 100644 (file)
@@ -524,20 +524,24 @@ void WOContext_leaveComponent(WOContext *self, WOComponent *_component) {
 }
 
 - (NSURL *)applicationURL {
-  if (self->appURL == nil) {
-    NSString *s;
+  NSString *s;
+  
+  if (self->appURL != nil)
+    return self->appURL;
 
-    s = [self->request adaptorPrefix];
-    if ([s length] > 0) {
-      s = [NSString stringWithFormat:@"%@/%@/", 
-                     s, [self->request applicationName]];
-    }
-    else
-      s = [[self->request applicationName] stringByAppendingString:@"/"];
-    
-    self->appURL =
-      [[NSURL URLWithString:s relativeToURL:[self serverURL]] retain];
+  // TODO: we should ensure that the suffix (.woa) is in the URL
+  
+  s = [self->request adaptorPrefix];
+  if ([s length] > 0) {
+    s = [[[s stringByAppendingString:@"/"]
+             stringByAppendingString:[self->request applicationName]]
+             stringByAppendingString:@"/"];
   }
+  else
+    s = [[self->request applicationName] stringByAppendingString:@"/"];
+  
+  self->appURL =
+    [[NSURL URLWithString:s relativeToURL:[self serverURL]] retain];
   return self->appURL;
 }
 - (NSURL *)urlForKey:(NSString *)_key {
index d33984ca6ad124563cecd6c82674f0401503185f..762f500df1576552d1e5d688a15aaeebce1bb70d 100644 (file)
@@ -31,6 +31,24 @@ SetHandler ngobjweb-adaptor
 SetAppPort 20000
 </LocationMatch>
 
+Apache on Debian SID
+====================
+
+Apache is not named 'httpd' on Debian, so you need to invoke make with a
+parameter.
+
+Compilation for Apache2:
+
+  make HTTPD=/usr/sbin/apache
+
+Afterwards move the build module to /usr/lib/apache/1.3/mod_ngobjweb.so and
+copy the *.info file to the same directory.
+
+Then run:
+  modules-config apache enable mod_ngobjweb
+
+Finally create a proper OGo.conf in /etc/apache/conf.d.
+
 Apache2 on SuSE 9.0
 ===================
 
index ab621d05128b2fbc228f21379500a629fc5109de..2c9596931aa03e37e649373458d73dc554701305 100644 (file)
@@ -1,3 +1,7 @@
+2004-09-07  Helge Hess  <helge.hess@skyrix.com>
+
+       * NGImap4: removed some crash situations wrt OGo bug #883 (v4.3.179)
+
 2004-09-05  Helge Hess  <helge.hess@opengroupware.org>
 
        * fixed common.h files not to depend on libFoundation internals
index c574af0719fe1e059834fd03adf0e012744fc8c8..c16ff08d2332b65d6a839faba852eb649780f2fa 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-07  Helge Hess  <helge.hess@skyrix.com>
+
+       * NGImap4ResponseParser.m: added some sanity checks for unexpected
+         parsing input, removes crashes as reported in OGo bug #883 (v4.3.179)
+
 2004-08-29  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * NGImap4.xcode: new Xcode project
index c1d388271680e8186a0fe3a4a9eba92fb26c0238..046a70a107754dda2766daba371eb4497f153dc1 100644 (file)
 // TODO(hh): code is now prepared for last-exception, but currently it just
 //           raises and may leak the exception object
 
+@interface NGImap4ResponseParser(ParsingPrivates)
+- (BOOL)_parseNumberUntaggedResponse:(NGMutableHashMap *)result_;
+- (NSDictionary *)_parseBodyContent;
+@end
+
 @implementation NGImap4ResponseParser
 
 #define __la(__SELF__, __LACNT) \
@@ -43,7 +48,6 @@ static __inline__ int _la(NGImap4ResponseParser *self, unsigned _laCnt) {
 }
 
 static NSDictionary *_parseBody(NGImap4ResponseParser *self);
-static NSDictionary *_parseBodyContent(NGImap4ResponseParser *self);
 static NSString *_parseBodyString(NGImap4ResponseParser *self,
                                   BOOL _convertString);
 static NSString *_parseBodyDecodeString(NGImap4ResponseParser *self,
@@ -60,8 +64,6 @@ static void _parseUntaggedResponse(NGImap4ResponseParser *self,
                                    NGMutableHashMap *result_);
 static BOOL _parseByeUntaggedResponse(NGImap4ResponseParser *self,
                                       NGMutableHashMap *result_);
-static BOOL _parseNumberUntaggedResponse(NGImap4ResponseParser *self,
-                                         NGMutableHashMap *result_);
 static NSArray *_parseFlagArray(NGImap4ResponseParser *self);
 static BOOL _parseFlagsUntaggedResponse(NGImap4ResponseParser *self,
                                         NGMutableHashMap *result_);
@@ -306,6 +308,7 @@ static void _parseSieveRespone(NGImap4ResponseParser *self,
 }
 
 static NSData *_parseData(NGImap4ResponseParser *self) {
+  // TODO: split up method
   NSData   *result;
   unsigned size;
   NSNumber *n;
@@ -396,9 +399,9 @@ static NSData *_parseData(NGImap4ResponseParser *self) {
         }
         [stream writeBytes:tmpBuf count:tmpBufCnt];
       }
-      if (lastChar != -1) {
+      if (lastChar != -1)
         [stream writeBytes:&lastChar count:1];
-      }
+      
       [stream close];
       [stream release]; stream = nil;
       result = [NSData dataWithContentsOfMappedFile:path];
@@ -407,14 +410,19 @@ static NSData *_parseData(NGImap4ResponseParser *self) {
       return result;
   }
 
-  {
+  if (size == 0) {
+    [self logWithFormat:@"ERROR(%s): got content size '0'!", 
+            __PRETTY_FUNCTION__];
+    return nil;
+  }
+  else {
     unsigned char *buf = NULL;
-    unsigned wasRead   = 0;
-    char *tmpBuf;
-    unsigned cnt, tmpBufCnt, tmpSize;
+    unsigned      wasRead   = 0;
+    unsigned char *tmpBuf;
+    unsigned      cnt, tmpBufCnt, tmpSize;
           
-    buf = malloc(sizeof(char) * size + 10);
-      
+    buf = calloc(size + 10, sizeof(char));
+    
     while (wasRead < size) {
       [self->buffer la:(size - wasRead <  LaSize) ? (size - wasRead) : LaSize];
             
@@ -424,22 +432,27 @@ static NSData *_parseData(NGImap4ResponseParser *self) {
     
     /* normalize response  \r\n -> \n */
        
-    tmpBuf    = malloc(sizeof(char) * size + 10);
+    tmpBuf    = calloc(size + 10, sizeof(char));
     cnt       = 0;
     tmpBufCnt = 0;
-    tmpSize   = size - 1;
-    while (cnt < tmpSize) {
-      if ((buf[cnt] == '\r') && (buf[cnt+1] == '\n')) {
-       cnt++;
-      }
-      tmpBuf[tmpBufCnt++] = buf[cnt++];
+    tmpSize   = size == 0 ? 0 : size - 1;
+    while (tmpBufCnt < tmpSize && cnt < size) {
+      if ((buf[cnt] == '\r') && (buf[cnt + 1] == '\n'))
+       cnt++; /* skip \r */
+      
+      tmpBuf[tmpBufCnt] = buf[cnt];
+      tmpBufCnt++;
+      cnt++;
+    }
+    if (cnt < size) {
+      tmpBuf[tmpBufCnt] = buf[cnt];
+      tmpBufCnt++;
+      cnt++;
     }
-    if (cnt < size)
-      tmpBuf[tmpBufCnt++] = buf[cnt++];
     
     result = [NSData dataWithBytesNoCopy:tmpBuf length:tmpBufCnt];
     
-    if (buf) free(buf); buf = NULL;
+    if (buf != NULL) free(buf); buf = NULL;
     return result;
   }
 }
@@ -571,7 +584,7 @@ static void _parseUntaggedResponse(NGImap4ResponseParser *self,
 
   case '0': case '1': case '2': case '3': case '4':
   case '5': case '6': case '7': case '8': case '9':
-    if (_parseNumberUntaggedResponse(self, result_)) // la: 5
+    if ([self _parseNumberUntaggedResponse:result_]) // la: 5
       /* eg "* 928 FETCH ..." */
       return;
     break;
@@ -972,8 +985,7 @@ static BOOL _parseByeUntaggedResponse(NGImap4ResponseParser *self,
   return NO;
 }
 
-static BOOL _parseNumberUntaggedResponse(NGImap4ResponseParser *self,
-                                         NGMutableHashMap *result_) {
+- (BOOL)_parseNumberUntaggedResponse:(NGMutableHashMap *)result_ {
   NSNumber *number = nil;
   NSString *key    = nil;
 
@@ -1000,7 +1012,12 @@ static BOOL _parseNumberUntaggedResponse(NGImap4ResponseParser *self,
       
       key = [_parseUntil(self, ' ') lowercaseString];
       if ([key hasPrefix:@"body["]) {
-        [fetch setObject:_parseBodyContent(self) forKey:key];
+        NSDictionary *content;
+        
+        if ((content = [self _parseBodyContent]) != nil)
+          [fetch setObject:content forKey:key];
+        else
+          [self logWithFormat:@"ERROR: got no body content for key: '%@'",key];
       }
       else if ([key isEqualToString:@"body"]) {
         [fetch setObject:_parseBody(self) forKey:key];
@@ -1027,8 +1044,7 @@ static BOOL _parseNumberUntaggedResponse(NGImap4ResponseParser *self,
         else 
           data = _parseData(self);
 
-        if (data)
-          [fetch setObject:data forKey:key];
+        if (data != nil) [fetch setObject:data forKey:key];
       }
       else {
        NSException *e;
@@ -1402,9 +1418,9 @@ static NSDictionary *_parseBody(NGImap4ResponseParser *self) {
   return result;
 }
 
-static NSDictionary *_parseBodyContent(NGImap4ResponseParser *self) {
+- (NSDictionary *)_parseBodyContent {
   NSData *data;
-
+  
   if (_la(self, 0) == '"') {
     NSString *str;
     _consume(self,1);
@@ -1415,6 +1431,10 @@ static NSDictionary *_parseBodyContent(NGImap4ResponseParser *self) {
   else 
     data = _parseData(self);
   
+  if (data == nil) {
+    [self logWithFormat:@"ERROR(%s): got no data.", __PRETTY_FUNCTION__];
+    return nil;
+  }
   return [NSDictionary dictionaryWithObject:data forKey:@"data"];
 }
 
index 6db097dd312ee247bc172b09b41f2d2d84b9d989..5f2383a01262a2c2a6809409d40e757f59427219 100644 (file)
@@ -2,6 +2,6 @@
 
 MAJOR_VERSION:=4
 MINOR_VERSION:=3
-SUBMINOR_VERSION:=178
+SUBMINOR_VERSION:=179
 
 # v4.2.149 requires libNGStreams v4.2.34