1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-09-19 01:36:33 -04:00
elinks/src/protocol
Kalle Olavi Niemitalo d93bceb9bd Fix blacklist crash in BitTorrent
make_bittorrent_peer_connection() used to construct a struct uri on
the stack. This was hacky but worked nicely because the struct uri
was not really accessed after make_connection() returned.  However,
since commit a83ff1f565, the struct uri
is also needed when the connection is being closed.  Valgrind shows:

Invalid read of size 2
   at 0x8100764: get_blacklist_entry (blacklist.c:33)
   by 0x8100985: del_blacklist_entry (blacklist.c:64)
   by 0x80DA579: complete_connect_socket (socket.c:448)
   by 0x80DA84A: connected (socket.c:513)
   by 0x80D0DDF: select_loop (select.c:297)
   by 0x80D00C6: main (main.c:353)
 Address 0xBEC3BFAE is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes

To fix this, allocate the struct uri on the heap instead, by
constructing a string and giving that to get_uri().  This string
cannot use the "bittorrent" URI scheme because parse_uri() does not
recognize the host and port fields in that.  (The "bittorrent" scheme
has protocol_backend.free_syntax = 1 in order to support strings like
"bittorrent:http://beta.legaltorrents.com/get/159-noisome-beasts".)
Instead, define a new "bittorrent-peer" URI scheme for this purpose.
If the user attempts to use this URI scheme, its handler aborts the
connection with an error; but when make_bittorrent_peer_connection()
uses a bittorrent-peer URI, the handler is not called.

This change also lets get_uri() set the ipv6 flag if peer_info->ip is
an IPv6 address literal.

Reported by Witold Filipczyk.
2008-09-07 06:31:36 +03:00
..
auth Strings corrections from Malcolm Parsons 2008-01-27 04:19:23 +00:00
bittorrent Fix blacklist crash in BitTorrent 2008-09-07 06:31:36 +03:00
file Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
finger Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
fsp Work around fsp_open_session() not setting errno. 2008-08-03 20:26:50 +03:00
ftp 1041: Add ftp_add_unparsed_line: HTML entities and more error checks. 2008-09-04 11:21:06 +03:00
gopher Bug 1013: Fix type mismatches in gopher.c 2008-09-04 11:57:03 +03:00
http Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
nntp Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
rewrite Minor fixes and improvements to option strings 2008-03-06 10:31:20 +02:00
smb Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
test Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
about.c Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
about.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00
common.c Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
common.h Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
data.c Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
data.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00
date.c parse_time: set tm_sec to zero before conditional second parsing 2008-02-28 23:38:42 +02:00
date.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00
header.c parse_header_param: better describe behaviour when @ret is NULL 2006-06-23 06:07:22 +00:00
header.h parse_header_param stores the string via a pointer parameter. 2006-06-05 20:22:53 +00:00
Makefile Bug 744: Add tests. There are four failures. 2007-07-19 13:46:47 +03:00
protocol.c Fix blacklist crash in BitTorrent 2008-09-07 06:31:36 +03:00
protocol.h Fix blacklist crash in BitTorrent 2008-09-07 06:31:36 +03:00
proxy.c Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
proxy.h Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
README.timegm Move README.timegm to the same directory as date.c. 2007-01-13 10:01:51 +02:00
uri.c bug 1000: Do not discard the query part of URI. 2008-03-02 17:45:29 +02:00
uri.h Move is_in_domain from cookies/cookies.c to protocol/uri.c and export 2007-09-14 16:51:04 +02:00
user.c Trim trailing whitespaces. 2007-09-14 15:12:32 +02:00
user.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00

This file contains description of our my_timegm() function in date.c. It was
posted as a mail to links-list by Stephane Chazelas, and I thought it may be
interesting for someone, so I decided to include it in the ELinks distribution.




Un explanation for it as one (me to start with) may wonder why
this works.

We first change of calendar. To make things easy, let's say
that 0/0/0 0:0:0 in our new calendar is the Marsh 1st 1968, so
just after a february 29th as 1968 was a leap year.

if y/m/d h:min:s is time in our calendar
and
   Y/M/D h:min:s in the new calendar

M = m - 1 - 2 (+ 12 if m < 3)
Y = y - 68 (-1 if m < 3)
D = d - 1

at Y/0/0 0:0:0, there has been Y / 4 leap years in the past, so
(int) 365 * Y + Y / 4 days have past.

at Y/M/0 0:0:0, lets find how many days have past since Y/0/0:

                   |Mar                                        Feb
                  M| 0   1   2   3   4   5   6   7   8   9  10  11
-------------------+-----------------------------------------------
 days in that month|31  30  31  30  31  31  30  31  30  31  31  28 or 29
-------------------+-----------------------------------------------
  x = days at Y/M/0| 0  31  61  92 122 153 184 214 245 275 306 337
-------------------+-----------------------------------------------
first approximation|
         y = 30 * M| 0  30  60  90 120 150 180 210 240 270 300 330
-------------------+-----------------------------------------------
              x - y| 0   1   1   2   2   3   4   4   5   5   6   7
-------------------+-----------------------------------------------
(M + 4) * 3 / 5 - 2| 0   1   1   2   2   3   4   4   5   5   6   7
-------------------+-----------------------------------------------

x - y = (M + 4) * 3 / 5 - 2

x = 30 * M + (M + 4) * 3 / 5 - 2

x = (153 * M + 2) / 5

So at Y/M/D 0:0:0,

Y * 1461 / 4 + (153 * M + 2) / 5 + D days have past since
the 1st of March of 1968

1st of March of 1968 was 671 days before 1970 Jan 1st (year 0
for unix time())

So
t = s + 60 * (min + 60 * (h + 24 * (Y * 1461 / 4 + (153 * M + 2) / 5 + D - 671)))
t = s + 60 * (min + 60 * (h + 24 * (Y * 1461 / 4 + (153 * M + 2) / 5 + d - 672)))

This shouldn't work past 2100/02/28 23:59:59 as 2100 is not a leap year.

--
St<53>phane