aboutsummaryrefslogtreecommitdiffstats
path: root/community/thttpd/remove_transfer_encoding.patch
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2017-11-01 17:51:18 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2017-11-01 18:03:10 +0000
commit0a1fb0d91a5354d312ed66ff48393d405b8f522e (patch)
tree4f190f46099faf427594e79490fdfee3d5b299c7 /community/thttpd/remove_transfer_encoding.patch
parentb4e57ea9ba009f96f0c61343ab7166217f0d19ff (diff)
downloadaports-0a1fb0d91a5354d312ed66ff48393d405b8f522e.tar.bz2
aports-0a1fb0d91a5354d312ed66ff48393d405b8f522e.tar.xz
community/thttpd: fix serving of .gz and .Z files
thttpd erroneously treats these files as a compressed transfer encoding rather than as a content type. this causes conforming http clients to strip the compression and save a decompressed version when downloading. since this was historically a common httpd bug, some web browsers work around the problem by detecting the .gz extension and ignoring the server's reported transfer encoding, but others, including wget 1.19.2, save a decompressed file, breaking file integrity checking (based on a hash or signature of the original compressed file) and breaking scripts which pass the -z option to tar when extracting. add a patch which removes thttpd's support for extension-based content transfer encodings, and adds the missing mime types for gzip and compress. the patch has been written to be minimally invasive to the program logic, and thus leaves a for loop that breaks on the first iteration rather than rewriting it.
Diffstat (limited to 'community/thttpd/remove_transfer_encoding.patch')
-rw-r--r--community/thttpd/remove_transfer_encoding.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/community/thttpd/remove_transfer_encoding.patch b/community/thttpd/remove_transfer_encoding.patch
new file mode 100644
index 0000000000..86df66cd0d
--- /dev/null
+++ b/community/thttpd/remove_transfer_encoding.patch
@@ -0,0 +1,169 @@
+diff --git a/Makefile.in b/Makefile.in
+index ded71e0..f9a6bc1 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -68,7 +68,7 @@ OBJ = $(SRC:.c=.o) @LIBOBJS@
+
+ ALL = thttpd
+
+-GENHDR = mime_encodings.h mime_types.h
++GENHDR = mime_types.h
+
+ CLEANFILES = $(ALL) $(OBJ) $(GENSRC) $(GENHDR)
+
+@@ -81,12 +81,6 @@ thttpd: $(OBJ)
+ @rm -f $@
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) $(NETLIBS)
+
+-mime_encodings.h: mime_encodings.txt
+- rm -f mime_encodings.h
+- sed < mime_encodings.txt > mime_encodings.h \
+- -e 's/#.*//' -e 's/[ ]*$$//' -e '/^$$/d' \
+- -e 's/[ ][ ]*/", 0, "/' -e 's/^/{ "/' -e 's/$$/", 0 },/'
+-
+ mime_types.h: mime_types.txt
+ rm -f mime_types.h
+ sed < mime_types.txt > mime_types.h \
+@@ -157,14 +151,14 @@ tar:
+ rm -rf $$name ; \
+ mkdir $$name ; \
+ tar cf - `cat FILES` | ( cd $$name ; tar xfBp - ) ; \
+- chmod 644 $$name/Makefile.in $$name/config.h $$name/mime_encodings.txt $$name/mime_types.txt ; \
++ chmod 644 $$name/Makefile.in $$name/config.h $$name/mime_types.txt ; \
+ chmod 755 $$name/cgi-bin $$name/cgi-src $$name/contrib $$name/contrib/redhat-rpm $$name/extras $$name/scripts ; \
+ tar cf $$name.tar $$name ; \
+ rm -rf $$name ; \
+ gzip $$name.tar
+
+ thttpd.o: config.h version.h libhttpd.h fdwatch.h mmc.h timers.h match.h
+-libhttpd.o: config.h version.h libhttpd.h mime_encodings.h mime_types.h \
++libhttpd.o: config.h version.h libhttpd.h mime_types.h \
+ mmc.h timers.h match.h tdate_parse.h
+ fdwatch.o: fdwatch.h
+ mmc.o: mmc.h libhttpd.h
+diff --git a/libhttpd.c b/libhttpd.c
+index 3814e6a..bbb4e14 100644
+--- a/libhttpd.c
++++ b/libhttpd.c
+@@ -2506,10 +2506,6 @@ struct mime_entry {
+ char* val;
+ size_t val_len;
+ };
+-static struct mime_entry enc_tab[] = {
+-#include "mime_encodings.h"
+- };
+-static const int n_enc_tab = sizeof(enc_tab) / sizeof(*enc_tab);
+ static struct mime_entry typ_tab[] = {
+ #include "mime_types.h"
+ };
+@@ -2533,15 +2529,9 @@ init_mime( void )
+ int i;
+
+ /* Sort the tables so we can do binary search. */
+- qsort( enc_tab, n_enc_tab, sizeof(*enc_tab), ext_compare );
+ qsort( typ_tab, n_typ_tab, sizeof(*typ_tab), ext_compare );
+
+ /* Fill in the lengths. */
+- for ( i = 0; i < n_enc_tab; ++i )
+- {
+- enc_tab[i].ext_len = strlen( enc_tab[i].ext );
+- enc_tab[i].val_len = strlen( enc_tab[i].val );
+- }
+ for ( i = 0; i < n_typ_tab; ++i )
+ {
+ typ_tab[i].ext_len = strlen( typ_tab[i].ext );
+@@ -2561,14 +2551,12 @@ figure_mime( httpd_conn* hc )
+ char* prev_dot;
+ char* dot;
+ char* ext;
+- int me_indexes[100], n_me_indexes;
+- size_t ext_len, encodings_len;
++ size_t ext_len;
+ int i, top, bot, mid;
+ int r;
+ char* default_type = "text/plain; charset=%s";
+
+ /* Peel off encoding extensions until there aren't any more. */
+- n_me_indexes = 0;
+ for ( prev_dot = &hc->expnfilename[strlen(hc->expnfilename)]; ; prev_dot = dot )
+ {
+ for ( dot = prev_dot - 1; dot >= hc->expnfilename && *dot != '.'; --dot )
+@@ -2583,25 +2571,7 @@ figure_mime( httpd_conn* hc )
+ }
+ ext = dot + 1;
+ ext_len = prev_dot - ext;
+- /* Search the encodings table. Linear search is fine here, there
+- ** are only a few entries.
+- */
+- for ( i = 0; i < n_enc_tab; ++i )
+- {
+- if ( ext_len == enc_tab[i].ext_len && strncasecmp( ext, enc_tab[i].ext, ext_len ) == 0 )
+- {
+- if ( n_me_indexes < sizeof(me_indexes)/sizeof(*me_indexes) )
+- {
+- me_indexes[n_me_indexes] = i;
+- ++n_me_indexes;
+- }
+- goto next;
+- }
+- }
+- /* No encoding extension found. Break and look for a type extension. */
+ break;
+-
+- next: ;
+ }
+
+ /* Binary search for a matching type extension. */
+@@ -2632,20 +2602,6 @@ figure_mime( httpd_conn* hc )
+
+ /* The last thing we do is actually generate the mime-encoding header. */
+ hc->encodings[0] = '\0';
+- encodings_len = 0;
+- for ( i = n_me_indexes - 1; i >= 0; --i )
+- {
+- httpd_realloc_str(
+- &hc->encodings, &hc->maxencodings,
+- encodings_len + enc_tab[me_indexes[i]].val_len + 1 );
+- if ( hc->encodings[0] != '\0' )
+- {
+- (void) strcpy( &hc->encodings[encodings_len], "," );
+- ++encodings_len;
+- }
+- (void) strcpy( &hc->encodings[encodings_len], enc_tab[me_indexes[i]].val );
+- encodings_len += enc_tab[me_indexes[i]].val_len;
+- }
+
+ }
+
+diff --git a/mime_encodings.txt b/mime_encodings.txt
+deleted file mode 100644
+index 2d3952d..0000000
+--- a/mime_encodings.txt
++++ /dev/null
+@@ -1,8 +0,0 @@
+-# mime_encodings.txt
+-#
+-# A list of file extensions followed by the corresponding MIME encoding.
+-# Extensions not found in the table proceed to the mime_types table.
+-
+-Z compress
+-gz gzip
+-uu x-uuencode
+diff --git a/mime_types.txt b/mime_types.txt
+index d4725d9..3d7ccbd 100644
+--- a/mime_types.txt
++++ b/mime_types.txt
+@@ -50,6 +50,7 @@ fh7 image/x-freehand
+ fhc image/x-freehand
+ gif image/gif
+ gtar application/x-gtar
++gz application/gzip
+ hdf application/x-hdf
+ hqx application/mac-binhex40
+ htm text/html; charset=%s
+@@ -195,4 +196,5 @@ xpm image/x-xpixmap
+ xsl text/xml; charset=%s
+ xwd image/x-xwindowdump
+ xyz chemical/x-xyz
++Z application/x-compress
+ zip application/zip