summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net-libs/libwww/files/libwww-5.4.0-htbound.patch')
-rw-r--r--net-libs/libwww/files/libwww-5.4.0-htbound.patch526
1 files changed, 0 insertions, 526 deletions
diff --git a/net-libs/libwww/files/libwww-5.4.0-htbound.patch b/net-libs/libwww/files/libwww-5.4.0-htbound.patch
deleted file mode 100644
index 111208a276c9..000000000000
--- a/net-libs/libwww/files/libwww-5.4.0-htbound.patch
+++ /dev/null
@@ -1,526 +0,0 @@
-diff -NurdB w3c-libwww-5.4.0/Library/src/HTBound.c w3c-libwww-5.4.0-patched/Library/src/HTBound.c
---- w3c-libwww-5.4.0/Library/src/HTBound.c 1999-02-22 17:10:10.000000000 -0500
-+++ w3c-libwww-5.4.0-patched/Library/src/HTBound.c 2005-10-27 08:23:47.000000000 -0500
-@@ -11,9 +11,12 @@
- **
- ** Authors
- ** HF Henrik Frystyk <frystyk@w3.org>
-+** SV Sam Varshavchik <mrsam@courier-mta.com>
- **
- ** History:
- ** Nov 95 Written from scratch
-+** SV Jun 05 Rewrote HTBoundary_put_block. Fixed many bugs+segfaults.
-+** SV Jul 05 Fix double-counting of processed bytes.
- **
- */
-
-@@ -23,104 +26,395 @@
- #include "WWWCore.h"
- #include "HTMerge.h"
- #include "HTReqMan.h"
-+#include "HTNetMan.h"
-+#include "HTChannl.h"
- #include "HTBound.h" /* Implemented here */
-
--#define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
-+#define PUTBLOCK(b, l) (me->target ? (*me->target->isa->put_block)(me->target, b, l):HT_OK)
-+
- #define PUTDEBUG(b, l) (*me->debug->isa->put_block)(me->debug, b, l)
- #define FREE_TARGET (*me->target->isa->_free)(me->target)
-
- struct _HTStream {
- const HTStreamClass * isa;
-+ HTNet * net;
- HTStream * target;
- HTStream * orig_target;
- HTFormat format;
- HTStream * debug; /* For preamble and epilog */
- HTRequest * request;
-- BOOL body; /* Body or preamble|epilog */
-- HTEOLState state;
-- int dash; /* Number of dashes */
- char * boundary;
-- char * bpos;
-+
-+ BOOL keptcrlf;
-+ int (*state)(HTStream *, const char *, int);
-+
-+ char *boundary_ptr;
-+
- };
-
-+PRIVATE int HTBoundary_flush (HTStream * me);
-+
- /* ------------------------------------------------------------------------- */
-
-+PRIVATE int start_of_line (HTStream * me, const char * b, int l);
-+PRIVATE int seen_dash (HTStream * me, const char * b, int l);
-+PRIVATE int seen_doubledash (HTStream * me, const char * b, int l);
-+PRIVATE int seen_delimiter_nonterminal(HTStream * me, const char * b, int l);
-+PRIVATE int seen_delimiter_nonterminal_CR(HTStream * me, const char * b, int l);
-+PRIVATE int seen_delimiter_dash(HTStream * me, const char * b, int l);
-+PRIVATE int seen_delimiter_terminal(HTStream * me, const char * b, int l);
-+PRIVATE int seen_delimiter_terminal_CR(HTStream * me, const char * b, int l);
-+PRIVATE int not_delimiter(HTStream * me, const char * b, int l, int extra);
-+PRIVATE int seen_nothing(HTStream * me, const char * b, int l);
-+PRIVATE int seen_cr(HTStream * me, const char * b, int l);
-+PRIVATE void process_boundary(HTStream *me, int isterminal);
-+
-+#define UNUSED(l) (l=l) /* Shut up about unused variables */
-+
- PRIVATE int HTBoundary_put_block (HTStream * me, const char * b, int l)
- {
-- const char *start = b;
-- const char *end = b;
-- while (l-- > 0) {
-- if (me->state == EOL_FCR) {
-- me->state = (*b == LF) ? EOL_FLF : EOL_BEGIN;
-- } else if (me->state == EOL_FLF) {
-- if (me->dash == 2) {
-- while (l>0 && *me->bpos && *me->bpos==*b) l--, me->bpos++, b++;
-- if (!*me->bpos) {
-- HTTRACE(STREAM_TRACE, "Boundary.... `%s\' found\n" _ me->boundary);
-- me->bpos = me->boundary;
-- me->body = YES;
-- me->state = EOL_DOT;
-- } else if (l>0) {
-- me->dash = 0;
-- me->bpos = me->boundary;
-- me->state = EOL_BEGIN;
-- }
-- }
-- if (*b == '-') {
-- me->dash++;
-- } else if (*b != CR && *b != LF) {
-- me->dash = 0;
-- me->state = EOL_BEGIN;
-- }
-- } else if (me->state == EOL_SLF) { /* Look for closing '--' */
-- if (me->dash == 4) {
-- if (end > start) {
-- int status = PUTBLOCK(start, end-start);
-- if (status != HT_OK) return status;
-+ /*
-+ ** The HTBoundary object gets attached downstream of HTMime.
-+ ** The HTBoundary object creates another HTMime object downstream of
-+ ** the HTBoundary object.
-+ **
-+ ** When we push data downstream to the second HTBoundary object, it
-+ ** updates the bytes read count in the HTNet object.
-+ **
-+ ** When we return to the parent HTMime object, itupdates the
-+ ** bytes read count in the HTNet object again. Oops.
-+ **
-+ ** Same thing happens with the consumed byte count. We can prevent
-+ ** the consumed byte counts from being updated by temporary setting
-+ ** the input channel stream pointer to NULL, but for the byte counts
-+ ** we have to save them and restore them before existing.
-+ **
-+ ** This bug was discovered by chance when a multipart/partial response
-+ ** was partially received, and as a result of double-counting the
-+ ** real response got cut off (because HTMime thought that more bytes
-+ ** were processed than actually were, thus it processed only the
-+ ** partial count of the remaining bytes in the response). When the
-+ ** multipart/partial response was received all at once this bug did
-+ ** not get triggered.
-+ */
-+
-+ HTHost *host=HTNet_host(me->net);
-+ HTChannel *c=HTHost_channel(host);
-+ HTInputStream *i=HTChannel_input(c);
-+
-+ long saveBytesRead=HTNet_bytesRead(me->net);
-+ long saveHeaderBytesRead=HTNet_headerBytesRead(me->net);
-+
-+ if (i)
-+ HTChannel_setInput(c, NULL);
-+
-+ HTTRACE(STREAM_TRACE, "Boundary: processing %d bytes\n" _ l);
-+ /* Main loop consumes all input */
-+
-+ while (l)
-+ {
-+ int n= (*me->state)(me, b, l);
-+
-+ if (n == 0)
-+ return HT_ERROR;
-+ b += n;
-+ l -= n;
-+ }
-+
-+ if (i)
-+ HTChannel_setInput(c, i);
-+ HTNet_setBytesRead(me->net, saveBytesRead);
-+ HTNet_setHeaderBytesRead(me->net, saveHeaderBytesRead);
-+
-+ return HT_OK;
-+}
-+
-+/*
-+** Start of line, keptcrlf=YES if we've kept the preceding CRLF from downstream
-+** and we'll pass it along if we decide that this is not a boundary delimiter.
-+*/
-+
-+PRIVATE int start_of_line (HTStream * me, const char * b, int l)
-+{
-+ if (*b != '-')
-+ return not_delimiter(me, b, l, 0);
-+
-+ HTTRACE(STREAM_TRACE, "Boundary: start of line: input '-'\n");
-+
-+ me->state= seen_dash;
-+
-+ return 1;
-+}
-+
-+/*
-+** Line: -
-+*/
-+
-+PRIVATE int seen_dash (HTStream * me, const char * b, int l)
-+{
-+ if (*b != '-')
-+ return not_delimiter(me, b, l, 1);
-+
-+ HTTRACE(STREAM_TRACE, "Boundary: start of line: input '--'\n");
-+
-+ me->state= seen_doubledash;
-+ me->boundary_ptr=me->boundary;
-+ return 1;
-+}
-+
-+/*
-+** Line: --
-+*/
-+
-+PRIVATE int seen_doubledash (HTStream * me, const char * b, int l)
-+{
-+ me->state=seen_doubledash;
-+
-+ if (*me->boundary_ptr)
-+ {
-+ if (*b != *me->boundary_ptr)
-+ {
-+ return not_delimiter(me, b, l,
-+ me->boundary_ptr - me->boundary
-+ + 2);
- }
-- HTTRACE(STREAM_TRACE, "Boundary.... Ending\n");
-- start = b;
-- me->dash = 0;
-- me->state = EOL_BEGIN;
-- }
-- if (*b == '-') {
-- me->dash++;
-- } else if (*b != CR && *b != LF) {
-- me->dash = 0;
-- me->state = EOL_BEGIN;
-- }
-- me->body = NO;
-- } else if (me->state == EOL_DOT) {
-- int status;
-- if (me->body) {
-- if (me->target) FREE_TARGET;
-+ ++me->boundary_ptr;
-+ return 1;
-+ }
-+
-+ /*
-+ ** Line: --delimiter
-+ */
-+
-+ if (*b == '-')
-+ {
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: start of line: input '--%s-'\n"
-+ _ me->boundary);
-+
-+ me->state=seen_delimiter_dash;
-+ return 1;
-+ }
-+
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: Found: '--%s'\n" _ me->boundary);
-+
-+ return seen_delimiter_nonterminal(me, b, l);
-+}
-+
-+/*
-+** Line: --delimiter
-+**
-+** Waiting for CRLF.
-+*/
-+
-+
-+PRIVATE int seen_delimiter_nonterminal(HTStream * me, const char * b, int l)
-+{
-+ UNUSED(l);
-+
-+ me->state=seen_delimiter_nonterminal;
-+ if (*b == CR)
-+ me->state=seen_delimiter_nonterminal_CR;
-+
-+ return 1;
-+}
-+
-+/*
-+** Line: --delimiter<CR>
-+*/
-+
-+PRIVATE int seen_delimiter_nonterminal_CR(HTStream * me, const char * b, int l)
-+{
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: Found: '--%s<CR>'\n" _ me->boundary);
-+
-+ if (*b != LF)
-+ return seen_delimiter_nonterminal(me, b, l);
-+
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: Found: '--%s<CR><LF>'\n" _ me->boundary);
-+
-+ process_boundary(me, NO);
-+ return 1;
-+}
-+
-+/*
-+** Line: --delimiter-
-+*/
-+
-+PRIVATE int seen_delimiter_dash(HTStream * me, const char * b, int l)
-+{
-+ if (*b != '-')
-+ return seen_delimiter_nonterminal(me, b, l);
-+
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: start of line: input '--%s--'\n"
-+ _ me->boundary);
-+
-+ me->state=seen_delimiter_terminal;
-+ return 1;
-+}
-+
-+/*
-+** Line: --delimiter--
-+*/
-+
-+PRIVATE int seen_delimiter_terminal(HTStream * me, const char * b, int l)
-+{
-+ UNUSED(l);
-+
-+ me->state=seen_delimiter_terminal;
-+
-+ if (*b == CR)
-+ me->state=seen_delimiter_terminal_CR;
-+ return 1;
-+}
-+/*
-+** Line: --delimiter--<CR>
-+*/
-+
-+PRIVATE int seen_delimiter_terminal_CR(HTStream * me, const char * b, int l)
-+{
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: Found '--%s--<CR>'\n"
-+ _ me->boundary);
-+
-+ if (*b != LF)
-+ return seen_delimiter_terminal(me, b, l);
-+ HTTRACE(STREAM_TRACE,
-+ "Boundary: Found '--%s--<CR><LF>'\n"
-+ _ me->boundary);
-+
-+ process_boundary(me, YES);
-+ return 1;
-+}
-+
-+/*
-+** Beginning of the line does not contain a delimiter.
-+**
-+**
-+** extra: Count of characters in a partially matched delimiter. Since it's
-+** not a delimiter this is content that needs to go downstream.
-+*/
-+
-+PRIVATE int not_delimiter(HTStream * me, const char * b, int l, int extra)
-+{
-+ HTTRACE(STREAM_TRACE, "Boundary: not a delimiter line\n");
-+
-+ if (me->keptcrlf)
-+ {
-+ HTTRACE(STREAM_TRACE, "Boundary: Sending previous line's <CR><LF>\n");
-+ /*
-+ ** Did not process CRLF from previous line, because prev CRLF
-+ ** is considered a part of the delimiter. See MIME RFC.
-+ */
-+
-+ me->keptcrlf=NO;
-+ if (PUTBLOCK("\r\n", 2) != HT_OK)
-+ return 0;
-+ }
-+
-+ /*
-+ ** Potentially matched some of: --DELIMITER
-+ */
-+
-+ if (extra)
-+ {
-+ HTTRACE(STREAM_TRACE, "Boundary: Sending partially-matched %d characters\n" _ extra);
-+
-+ if (PUTBLOCK("--", extra > 2 ? 2:extra) != HT_OK)
-+ return 0;
-+
-+ if (extra > 2)
-+ if (PUTBLOCK(me->boundary, extra-2) != HT_OK)
-+ return 0;
-+ }
-+ return seen_nothing(me, b, l);
-+}
-+
-+/*
-+** We're not looking for a delimiter. Look for the next line of input
-+** in the data that could potentially be a delimiter.
-+*/
-+
-+PRIVATE int seen_nothing(HTStream * me, const char * b, int l)
-+{
-+ int i;
-+
-+ me->state=seen_nothing;
-+
-+ for (i=0; i<l; i++)
-+ {
-+ if (b[i] != CR)
-+ continue;
-+
-+ /*
-+ ** If we have at least four more characters in unconsumed
-+ ** input, and they're not \r\n--, we can safely skip over
-+ ** them.
-+ */
-+
-+ if (l-i > 4 &&
-+ strncmp(b+i, "\r\n--", 4))
-+ continue;
-+ break;
-+ }
-+
-+ if (i == 0)
-+ {
-+ /* Could only be a CR here. */
-+
-+ me->state=seen_cr;
-+ return 1;
-+ }
-+
-+ HTTRACE(STREAM_TRACE, "Boundary: Processed %d (out of %d) bytes\n"
-+ _ i _ l);
-+
-+ if (PUTBLOCK(b, i) != HT_OK)
-+ return 0;
-+
-+ return i;
-+}
-+
-+/*
-+** State: seen a CR
-+*/
-+
-+PRIVATE int seen_cr(HTStream * me, const char * b, int l)
-+{
-+ HTTRACE(STREAM_TRACE, "Boundary: Processed <CR>\n");
-+
-+ if (*b != LF)
-+ {
-+ HTTRACE(STREAM_TRACE, "Boundary: ... <LF> didn't follow\n");
-+ if (PUTBLOCK("\r", 1) != HT_OK)
-+ return 0;
-+ return seen_nothing(me, b, l);
-+ }
-+
-+ HTTRACE(STREAM_TRACE, "Boundary: Processed <CR><LF>\n");
-+ me->state=start_of_line;
-+ me->keptcrlf=YES;
-+ return 1;
-+}
-+
-+PRIVATE void process_boundary(HTStream *me, int isterminal)
-+{
-+ HTBoundary_flush(me);
-+ if (me->target) FREE_TARGET;
-+ me->target=NULL;
-+ me->state=start_of_line;
-+ me->keptcrlf=NO;
-+
-+ if (!isterminal)
- me->target = HTStreamStack(WWW_MIME,me->format,
- HTMerge(me->orig_target, 2),
- me->request, YES);
-- if (end > start) {
-- if ((status = PUTBLOCK(start, end-start)) != HT_OK)
-- return status;
-- }
-- } else {
-- if (me->debug)
-- if ((status = PUTDEBUG(start, end-start)) != HT_OK)
-- return status;
-- }
-- start = b;
-- if (*b == '-') me->dash++;
-- me->state = EOL_SLF;
-- } else if (*b == CR) {
-- me->state = EOL_FCR;
-- end = b;
-- } else if (*b == LF) {
-- if (me->state != EOL_FCR) end = b;
-- me->state = EOL_FLF;
-- }
-- b++;
-- }
-- return (start<b && me->body) ? PUTBLOCK(start, b-start) : HT_OK;
- }
-
-+
- PRIVATE int HTBoundary_put_string (HTStream * me, const char * s)
- {
- return HTBoundary_put_block(me, s, (int) strlen(s));
-@@ -133,7 +427,9 @@
-
- PRIVATE int HTBoundary_flush (HTStream * me)
- {
-- return (*me->target->isa->flush)(me->target);
-+ if (me->target == NULL)
-+ return HT_OK;
-+ return (*me->target->isa->flush)(me->target);
- }
-
- PRIVATE int HTBoundary_free (HTStream * me)
-@@ -182,18 +478,26 @@
- HTResponse_formatParam(response) :
- HTAnchor_formatParam(anchor);
- char * boundary = HTAssocList_findObject(type_param, "boundary");
-+
-+ UNUSED(param);
-+ UNUSED(input_format);
-+
- if (boundary) {
- HTStream * me;
- if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
- HT_OUTOFMEM("HTBoundary");
- me->isa = &HTBoundaryClass;
-- me->request = request;
-+ me->net = HTRequest_net(request);
-+ me->request = request;
- me->format = output_format;
- me->orig_target = output_stream;
- me->debug = HTRequest_debugStream(request);
-- me->state = EOL_FLF;
-+
-+ me->state = start_of_line;
-+ me->keptcrlf=NO;
-+
- StrAllocCopy(me->boundary, boundary); /* Local copy */
-- me->bpos = me->boundary;
-+
- HTTRACE(STREAM_TRACE, "Boundary.... Stream created with boundary '%s\'\n" _ me->boundary);
- return me;
- } else {