--- Begin Message ---
Package: polipo
Version: 1.0.4-1
Severity: grave
Tags: patch
Justification: renders package unusable
When polipo receives a "Cache-Control: max-age" line without a value,
it logs a parsing error but then continues to use the not-parsed value,
resulting in a segfault. It does this in several places in http_parse.c.
I have attached a stacktrace and patch that seems to
work for me. You should check that I have not missed an occurence of the
same error.
-- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'stable')
Architecture: i386 (i686)
Kernel: Linux 2.6.30-1-686 (SMP w/1 CPU core)
Locale: lang=de...@euro, lc_ctype=de...@euro (charmap=ISO-8859-15)
Shell: /bin/sh linked to /bin/dash
Versions of packages polipo depends on:
ii libc6 2.9-26 GNU C Library: Shared libraries
polipo recommends no packages.
polipo suggests no packages.
-- no debconf information
--- polipo-1.0.4.orig/http_parse.c
+++ polipo-1.0.4/http_parse.c
@@ -1088,9 +1088,10 @@
(v_end >= 0 ? v_end : token_end) -
token_start);
do_log(L_WARN, "\n");
+ } else {
+ a = atoi(buf + v_start);
+ cache_control.max_age = a;
}
- a = atoi(buf + v_start);
- cache_control.max_age = a;
} else if(token_compare(buf, token_start, token_end,
"s-maxage")) {
int a;
@@ -1100,9 +1101,10 @@
(v_end >= 0 ? v_end : token_end) -
token_start);
do_log(L_WARN, "\n");
+ } else {
+ a = atoi(buf + v_start);
+ cache_control.max_age = a;
}
- a = atoi(buf + v_start);
- cache_control.max_age = a;
} else if(token_compare(buf, token_start, token_end,
"min-fresh")) {
int a;
@@ -1112,9 +1114,10 @@
(v_end >= 0 ? v_end : token_end) -
token_start);
do_log(L_WARN, "\n");
+ } else {
+ a = atoi(buf + v_start);
+ cache_control.max_age = a;
}
- a = atoi(buf + v_start);
- cache_control.max_age = a;
} else if(token_compare(buf, token_start, token_end,
"max-stale")) {
int a;
@@ -1124,9 +1127,10 @@
(v_end >= 0 ? v_end : token_end) -
token_start);
do_log(L_WARN, "\n");
+ } else {
+ a = atoi(buf + v_start);
+ cache_control.max_stale = a;
}
- a = atoi(buf + v_start);
- cache_control.max_stale = a;
} else {
do_log(L_WARN, "Unsupported Cache-Control directive ");
do_log_n(L_WARN, buf + token_start,
(gdb) bt full
#0 0xb7f22b38 in *__GI_____strtol_l_internal (nptr=0xb7dcefff <Address
0xb7dcefff out of bounds>, endptr=0x0, base=10,
group=0, loc=0xb804c380) at strtol_l.c:298
negative = <value optimized out>
cutoff = <value optimized out>
i = <value optimized out>
s = <value optimized out>
c = <value optimized out>
save = <value optimized out>
end = <value optimized out>
overflow = <value optimized out>
cnt = <value optimized out>
current = <value optimized out>
thousands = 0x0
thousands_len = <value optimized out>
grouping = 0x0
#1 0xb7f228a0 in *__GI_strtol (nptr=0xb7dcefff <Address 0xb7dcefff out of
bounds>, endptr=0x0, base=10) at strtol.c:110
No locals.
#2 0xb7f1f891 in atoi (nptr=0xb7dcefff <Address 0xb7dcefff out of bounds>) at
atoi.c:28
No locals.
#3 0x08061e18 in httpParseHeaders (client=0, url=0x979fe28,
buf=0xb7dcf000 "HTTP/1.1 200 OK\r\nDate: Wed, 16 Sep 2009 21:03:06
GMT\r\nServer: Apache/2.2.9 (Unix) mod_jk/1.2.26\r\nSet-Cookie:
GY_1HIST=loc%3Dfeldkirchen%3A%3A%3A%23vaterstetten%3A%3A%3A%23%7C%7Ccat%3Dcopy+shop%23;
Exp"...,
start=17, request=0x979faf8, headers_return=0xbff52d10,
len_return=0xbff52d0c, cache_control_return=0xbff52ccc,
condition_return=0x0, te_return=0xbff52d08, date_return=0xbff52d00,
last_modified_return=0xbff52cfc,
expires_return=0xbff52cf8, polipo_age_return=0x0, polipo_access_return=0x0,
polipo_body_offset_return=0x0,
age_return=0xbff52d04, etag_return=0xbff52cf4, expect_return=0x0,
range_return=0x0,
content_range_return=0xbff52ce0, location_return=0x0,
via_return=0xbff52cf0, auth_return=0x0) at http_parse.c:1092
v_start = -1
v_end = -1
local = 0
hbuf_small = "\r\nServer: Apache/2.2.9 (Unix)
mod_jk/1.2.26\r\nSet-Cookie:
GY_1HIST=loc%3Dfeldkirchen%3A%3A%3A%23vaterstetten%3A%3A%3A%23%7C%7Ccat%3Dcopy+shop%23;
Expires=Thu, 16-Sep-2010 21:03:07 GMT;
Path=/\365\277O\361\365\267\364\277\4\270\377\377\334\267\b\276\b\270\360*\365\277\f+\365\277u<\224|X\30\a\270"...
hbuf = 0xbff529f8 "\r\nServer: Apache/2.2.9 (Unix)
mod_jk/1.2.26\r\nSet-Cookie:
GY_1HIST=loc%3Dfeldkirchen%3A%3A%3A%23vaterstetten%3A%3A%3A%23%7C%7Ccat%3Dcopy+shop%23;
Expires=Thu, 16-Sep-2010 21:03:07 GMT;
Path=/\365\277O\361\365\267\364\277\4\270"...
hbuf_size = 512
hbuf_length = 190
i = 268
j = 268
name_start = 244
name_end = <value optimized out>
value_start = 259
value_end = 266
token_start = 259
token_end = 266
end = 1
name = 0x979ab68
date = 1253134986
last_modified = -1
expires = -1
polipo_age = -1
polipo_access = -1
polipo_body_offset = -1
len = -1
endptr = 0xb804d190 "
\3z\t\320\373y\t\320\373y\t\320\373y\t\270\375y\t`\261y\t\240\321\4\270\240\321\4\270\250\321\4\270\250\321\4\270\260\321\4\270\260\321\4\270\270\321\4\270\270\321\4\270\300\321\4\270\300\321\4\270\310\321\4\270\310\321\4\270\320\321\4\270\320\321\4\270\330\321\4\270\330\321\4\270\340\321\4\270\340\321\4\270\350\321\4\270\350\321\4\270\360\321\4\270\360\321\4\270\370\321\4\270\370\321\4\270"
te = 0
age = -1
etag = 0x0
ifrange = 0x0
persistent = 1
location = 0x0
via = 0x0
auth = 0x0
expect = 0x0
condition = <value optimized out>
ims = -1
inms = -1
im = 0x0
inm = 0x0
hopToHop = 0x0
haveCacheControl = 1
__PRETTY_FUNCTION__ = "httpParseHeaders"
#4 0x0805dd54 in httpServerHandlerHeaders (eof=0, event=0x979fdd0,
srequest=0x979fde0, connection=0x979fb60)
at server.c:1920
request = 0x979faf8
object = 0x979f9a8
rc = <value optimized out>
code = <value optimized out>
version = 1
full_len = <value optimized out>
headers = <value optimized out>
len = <value optimized out>
te = <value optimized out>
cache_control = {flags = 134600709, max_age = 256, s_maxage = 4,
min_fresh = 0, max_stale = 158989160}
age = -1
date = <value optimized out>
last_modified = <value optimized out>
expires = <value optimized out>
init_time = <value optimized out>
etag = <value optimized out>
via = <value optimized out>
new_via = <value optimized out>
expect_body = <value optimized out>
content_range = {from = 4096, to = 134605195, full_length = 158989152}
new_object = <value optimized out>
supersede = <value optimized out>
message = 0x979fe10
url = 0x979fe28
__PRETTY_FUNCTION__ = "httpServerHandlerHeaders"
#5 0x0805ea6d in httpServerReplyHandler (status=0, event=0x979fdd0,
srequest=0x979fde0) at server.c:1807
connection = 0x979fb60
request = 0x979faf8
i = <value optimized out>
body = 620
bufsize = 4096
__PRETTY_FUNCTION__ = "httpServerReplyHandler"
#6 0x0804cdef in do_scheduled_stream (status=0, event=0x979fdd0) at io.c:368
request = 0x979fde0
rc = <value optimized out>
done = <value optimized out>
i = 1
iov = {{iov_base = 0xb7dcf000, iov_len = 4096}, {iov_base = 0x979fd30,
iov_len = 3}, {iov_base = 0xc,
iov_len = 24}, {iov_base = 0xbff52dd8, iov_len = 134525095},
{iov_base = 0x979fd38, iov_len = 3220516312}, {
iov_base = 0x4e20, iov_len = 4}}
chunk_header_len = 158989160
chunk_header = "\374\267\0\0\0\0\1\0\0"
len12 = 4096
len123 = 4096
__PRETTY_FUNCTION__ = "do_scheduled_stream"
#7 0x0804b3ef in eventLoop () at event.c:713
rc = <value optimized out>
i = 2
done = <value optimized out>
n = 0
event = 0x979fdd0
#8 0x08053f2d in main (argc=8, argv=0xbff52ed4) at main.c:165
listener = 0xb804c380
i = 8
rc = <value optimized out>
expire = 0
printConfig = 0
--- End Message ---