Skip to content
This repository has been archived by the owner on Apr 19, 2024. It is now read-only.

Commit

Permalink
Cleanups to proxy code: greater robustness in receiving proxy data,
Browse files Browse the repository at this point in the history
better error reporting for SOCKS 5 and HTTP proxies.

[originally from svn r1973]
  • Loading branch information
sgtatham committed Sep 21, 2002
1 parent d33c200 commit e7e92ac
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 67 deletions.
48 changes: 39 additions & 9 deletions misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ void base64_encode_atom(unsigned char *data, int n, char *out)
* - return a (pointer,length) pair giving some initial data in
* the list, suitable for passing to a send or write system
* call
* - retrieve a larger amount of initial data from the list
* - return the current size of the buffer chain in bytes
*/

Expand Down Expand Up @@ -155,16 +156,23 @@ void bufchain_add(bufchain *ch, void *data, int len)

void bufchain_consume(bufchain *ch, int len)
{
struct bufchain_granule *tmp;

assert(ch->buffersize >= len);
assert(ch->head != NULL && ch->head->bufpos + len <= ch->head->buflen);
ch->head->bufpos += len;
ch->buffersize -= len;
if (ch->head->bufpos >= ch->head->buflen) {
struct bufchain_granule *tmp = ch->head;
ch->head = tmp->next;
sfree(tmp);
if (!ch->head)
ch->tail = NULL;
while (len > 0) {
int remlen = len;
assert(ch->head != NULL);
if (remlen >= ch->head->buflen - ch->head->bufpos) {
remlen = ch->head->buflen - ch->head->bufpos;
tmp = ch->head;
ch->head = tmp->next;
sfree(tmp);
if (!ch->head)
ch->tail = NULL;
} else
ch->head->bufpos += remlen;
ch->buffersize -= remlen;
len -= remlen;
}
}

Expand All @@ -174,6 +182,28 @@ void bufchain_prefix(bufchain *ch, void **data, int *len)
*data = ch->head->buf + ch->head->bufpos;
}

void bufchain_fetch(bufchain *ch, void *data, int len)
{
struct bufchain_granule *tmp;
char *data_c = (char *)data;

tmp = ch->head;

assert(ch->buffersize >= len);
while (len > 0) {
int remlen = len;

assert(tmp != NULL);
if (remlen >= tmp->buflen - tmp->bufpos)
remlen = tmp->buflen - tmp->bufpos;
memcpy(data_c, tmp->buf + tmp->bufpos, remlen);

tmp = tmp->next;
len -= remlen;
data_c += remlen;
}
}

/* ----------------------------------------------------------------------
* My own versions of malloc, realloc and free. Because I want
* malloc and realloc to bomb out and exit the program if they run
Expand Down
1 change: 1 addition & 0 deletions misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ int bufchain_size(bufchain *ch);
void bufchain_add(bufchain *ch, void *data, int len);
void bufchain_prefix(bufchain *ch, void **data, int *len);
void bufchain_consume(bufchain *ch, int len);
void bufchain_fetch(bufchain *ch, void *data, int len);

/*
* Debugging functions.
Expand Down
Loading

0 comments on commit e7e92ac

Please sign in to comment.