compression.c revision 5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic bool is_compressed_zlib(struct istream *input)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *data;
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch /* Peek in to the stream and see if it looks like it's compressed
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch (based on its header). This also means that users can try to exploit
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch security holes in the uncompression library by APPENDing a specially
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch crafted mail. So let's hope zlib is free of holes. */
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch if (i_stream_read_data(input, &data, &size, 1) <= 0)
de96afeeaa5242cffe89f1966457e935806b5746Stephan Boschstatic bool is_compressed_bzlib(struct istream *input)
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch const unsigned char *data;
d67f004ebf944adca3ba09ed547febfa75442476Stephan Bosch if (i_stream_read_data(input, &data, &size, 4+6 - 1) <= 0)
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch return memcmp(data + 4, "\x31\x41\x59\x26\x53\x59", 6) == 0;
6776cc851a593b2a893103833e08ed3902ce1933Stephan Boschconst struct compression_handler *compression_lookup_handler(const char *name)
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch unsigned int i;
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch for (i = 0; compression_handlers[i].name != NULL; i++) {
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch if (strcmp(name, compression_handlers[i].name) == 0)
6776cc851a593b2a893103833e08ed3902ce1933Stephan Boschcompression_detect_handler(struct istream *input)
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch unsigned int i;
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch for (i = 0; compression_handlers[i].name != NULL; i++) {
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch if (compression_handlers[i].is_compressed != NULL &&
6776cc851a593b2a893103833e08ed3902ce1933Stephan Boschcompression_lookup_handler_from_ext(const char *path)
6776cc851a593b2a893103833e08ed3902ce1933Stephan Bosch for (i = 0; compression_handlers[i].name != NULL; i++) {
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch strcmp(path + path_len - len, compression_handlers[i].ext) == 0)
7384b4e78eaab44693c985192276e31322155e32Stephan Boschconst struct compression_handler compression_handlers[] = {