[mapserver-commits] r8521 - trunk/mapserver

svn at osgeo.org svn at osgeo.org
Mon Feb 9 13:24:43 EST 2009


Author: pramsey
Date: 2009-02-09 13:24:43 -0500 (Mon, 09 Feb 2009)
New Revision: 8521

Modified:
   trunk/mapserver/mappostgis.c
Log:
Make base64 decoding data validation optional, for a bit more speed.


Modified: trunk/mapserver/mappostgis.c
===================================================================
--- trunk/mapserver/mappostgis.c	2009-02-09 17:16:11 UTC (rev 8520)
+++ trunk/mapserver/mappostgis.c	2009-02-09 18:24:43 UTC (rev 8521)
@@ -721,14 +721,21 @@
 ** into "dest" (not null terminated).
 ** Returns length of decoded array or 0 on failure.
 */
-int msPostGISBase64Decode(unsigned char *dest, const char *src) {
+int msPostGISBase64Decode(unsigned char *dest, const char *src, int srclen) {
 
     if (src && *src) {
 
         unsigned char *p = dest;
-        int i, j, k;
-        unsigned char *buf = calloc(strlen(src) + 1, sizeof(unsigned char));
 
+#ifdef BASE64_VALIDATE
+        int i = 0, j = 0, k = 0;
+        unsigned char *buf = calloc(srclen + 1, sizeof(unsigned char));
+#else
+        int j = srclen, k = 0;
+        const char *buf = src;
+#endif
+
+#ifdef BASE64_VALIDATE
         /* Drop illegal chars first */
         for (i=0, j=0; src[i]; i++) {
             unsigned char c = src[i];
@@ -736,6 +743,7 @@
                 buf[j++] = c;
             }
         }
+#endif
 
         for (k=0; k<j; k+=4) {
             register unsigned char c1='A', c2='A', c3='A', c4='A';
@@ -766,7 +774,9 @@
                 *p++=(((b3&0x3)<<6)|b4 );
             }
         }
+#ifdef BASE64_VALIDATE
         free(buf);
+#endif
         return(p-dest);
     }
     return 0;
@@ -1216,7 +1226,8 @@
     char *wkb64 = NULL;
     unsigned char *wkb = NULL;
     msPostGISLayerInfo *layerinfo = NULL;
-    int result;
+    int result = 0;
+    int wkb64len = 0;
 
     if (layer->debug) {
         msDebug("msPostGISReadShape called.\n");
@@ -1227,15 +1238,17 @@
 
     /* Retrieve the geometry. */
     wkb64 = (char*)PQgetvalue(layerinfo->pgresult, layerinfo->rownum, layer->numitems );
-
+    wkb64len = PQgetlength(layerinfo->pgresult, layerinfo->rownum, layer->numitems);
+    
     if ( ! wkb64 ) {
         msSetError(MS_QUERYERR, "Base64 WKB returned is null!", "msPostGISReadShape()");
         return MS_FAILURE;
     }
 
-    wkb = calloc(PQgetlength(layerinfo->pgresult, layerinfo->rownum, layer->numitems), sizeof(char));
-    result = msPostGISBase64Decode(wkb, wkb64);
 
+    wkb = calloc(wkb64len, sizeof(char));
+    result = msPostGISBase64Decode(wkb, wkb64, wkb64len);
+
     if( ! result ) {
         free(wkb);
         return MS_FAILURE;



More information about the mapserver-commits mailing list