> Without version info from the original poster, who knows? But for good
> measure, could you link to your fix so we can figure out if it has
> been undone? Your response indicates to me that you are more alert to
> the telltale signs of a particular defect. But this isn't something
> that I recognize. Help us out.
Sorry for the delay but since I am on a 2 year sabbatical, accessing
the data was pretty difficult.
Here is the only patch I could find for 4.0.10 compress.c, which I
believe is now part of nszlib.c in 4.5. I don't think I applied it to
4.5 since I mostly moved over to Naviserver after 4.0.10. The
problem was caused by returning incorrect CRC values as well as
sending a few too many bytes back the to the user.
Patch is attached. I also attached the fixed compress.c. It's the
best I can do at the moment.
Daniel
| ---------------------------------------------------------------
| Daniel P. Stasinski | http://www.saidsimple.com
| [email protected] | http://www.disabilities-r-us.com
| XMMP: [email protected] | http://www.avenues.org
| Google Talk: mooooooo | http://www.scriptkitties.com
--
AOLserver - http://www.aolserver.com/
To Remove yourself from this list, simply send an email to
<[email protected]> with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject:
field of your email blank.
/*
* The contents of this file are subject to the AOLserver Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://aolserver.com/.
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is AOLserver Code and related documentation
* distributed by AOL.
*
* The Initial Developer of the Original Code is America Online,
* Inc. Portions created by AOL are Copyright (C) 1999 America Online,
* Inc. All Rights Reserved.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License (the "GPL"), in which case the
* provisions of GPL are applicable instead of those above. If you wish
* to allow use of your version of this file only under the terms of the
* GPL and not to allow others to use your version of this file under the
* License, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the GPL.
* If you do not delete the provisions above, a recipient may use your
* version of this file under either the License or the GPL.
*/
/*
* compress.c --
*
* Support for simple gzip compression using Zlib.
*/
static const char *RCSID = "@(#) $Header:
/cvsroot/aolserver/aolserver/nsd/compress.c,v 1.1.2.3 2005/01/12 19:11:46 dossy
Exp $, compiled: " __DATE__ " " __TIME__;
#include "ns.h"
#ifdef HAVE_ZLIB_H
#include <zlib.h>
static char header[] = {
037, 0213, /* GZIP magic number. */
010, /* Z_DEFLATED */
0, /* flags */
0,0,0,0, /* timestamp */
0, /* xflags */
03}; /* Unix OS_CODE */
/*
*----------------------------------------------------------------------
*
* Ns_CompressGzip --
*
* Compress a string using gzip with RFC 1952 header/footer.
*
* Results:
* NS_OK if compression worked, NS_ERROR otherwise.
*
* Side effects:
* Will write compressed content to given Tcl_DString.
*
*----------------------------------------------------------------------
*/
int
Ns_CompressGzip(char *buf, int len, Tcl_DString *outPtr, int level)
{
uLongf glen;
char *gbuf;
uLong crc;
int skip;
uint32_t footer[2];
/*
* Grow buffer for header, footer, and maximum compressed size.
*/
glen = compressBound(len) + sizeof(header) + sizeof(footer);
Tcl_DStringSetLength(outPtr, glen);
/*
* Compress output starting 2-bytes from the end of the header.
*/
gbuf = outPtr->string;
skip = sizeof(header) - 2;
glen -= skip;
if (compress2(gbuf + skip, &glen, buf, (uLong) len, level) != Z_OK) {
return NS_ERROR;
}
glen -= 4;
memcpy(gbuf, header, sizeof(header));
Tcl_DStringSetLength(outPtr, glen + skip);
/*
* Append footer of CRC and uncompressed length.
*/
crc = crc32(0, Z_NULL, 0);
crc = crc32(crc, buf, len);
footer[0] = crc;
footer[1] = len;
Tcl_DStringAppend(outPtr, (char *) footer, sizeof(footer));
return NS_OK;
}
#else
int
Ns_CompressGzip(char *buf, int len, Tcl_DString *outPtr, int level)
{
return NS_ERROR;
}
#endif
/*
*----------------------------------------------------------------------
*
* Ns_Compress --
*
* Deprecated: Used by nsjk2 module. Remove this once nsjk2 has
* been updated to use Ns_CompressGzip directly.
*
* Results:
* NS_OK if compression worked, NS_ERROR otherwise.
*
* Side effects:
* Will write compressed content to given Tcl_DString.
*
*----------------------------------------------------------------------
*/
int
Ns_Compress(char *buf, int len, Tcl_DString *outPtr, int level)
{
return Ns_CompressGzip(buf, len, outPtr, level);
}
--- /home/daniel/compress.c 2005-01-12 12:11:46.000000000 -0700
+++ compress.c 2009-10-13 17:11:45.853632566 -0700
@@ -11,7 +11,7 @@
*
* The Original Code is AOLserver Code and related documentation
* distributed by AOL.
- *
+ *
* The Initial Developer of the Original Code is America Online,
* Inc. Portions created by AOL are Copyright (C) 1999 America Online,
* Inc. All Rights Reserved.
@@ -48,7 +48,7 @@
0, /* xflags */
03}; /* Unix OS_CODE */
-
+
/*
*----------------------------------------------------------------------
*
@@ -78,11 +78,11 @@
* Grow buffer for header, footer, and maximum compressed size.
*/
- glen = len + (len / 100) + 13 + sizeof(header) + sizeof(footer);
+ glen = compressBound(len) + sizeof(header) + sizeof(footer);
Tcl_DStringSetLength(outPtr, glen);
/*
- * Compress output starting 2-bytes from the end of the header.
+ * Compress output starting 2-bytes from the end of the header.
*/
gbuf = outPtr->string;
@@ -91,6 +91,7 @@
if (compress2(gbuf + skip, &glen, buf, (uLong) len, level) != Z_OK) {
return NS_ERROR;
}
+ glen -= 4;
memcpy(gbuf, header, sizeof(header));
Tcl_DStringSetLength(outPtr, glen + skip);
@@ -100,8 +101,8 @@
crc = crc32(0, Z_NULL, 0);
crc = crc32(crc, buf, len);
- footer[0] = htonl(crc);
- footer[1] = htonl(len);
+ footer[0] = crc;
+ footer[1] = len;
Tcl_DStringAppend(outPtr, (char *) footer, sizeof(footer));
return NS_OK;
@@ -117,7 +118,7 @@
#endif
-
+
/*
*----------------------------------------------------------------------
*