X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/6e058b4b60e01b874bfe6a9814b1d6b1944d6ae7..bd685982389b78a158921b7839bdeca501338d19:/token.c diff --git a/token.c b/token.c index 81e25372..75d2b17b 100644 --- a/token.c +++ b/token.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2007 Wayne Davison + * Copyright (C) 2003-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ */ #include "rsync.h" +#include "itypes.h" #include "zlib/zlib.h" extern int do_compression; @@ -44,12 +45,12 @@ static void add_suffix(struct suffix_tree **prior, char ltr, const char *str) if (ltr == '[') { const char *after = strchr(str, ']'); - /* Just skip bogus character classes. */ - if (!after++) + /* Treat "[foo" and "[]" as having a literal '['. */ + if (after && after++ != str+1) { + while ((ltr = *str++) != ']') + add_suffix(prior, ltr, after); return; - while ((ltr = *str++) != ']') - add_suffix(prior, ltr, after); - return; + } } for (node = *prior; node; prior = &node->sibling, node = node->sibling) { @@ -99,7 +100,6 @@ static void add_nocompress_suffixes(const char *str) } while (*++f != '/' && *f); *t++ = '\0'; - fprintf(stderr, "adding `%s'\n", buf); add_suffix(&suftree, *buf, buf+1); } @@ -151,7 +151,7 @@ static void init_set_compression(void) /* Move *.foo items into the stuffix tree. */ if (*start == '*' && start[1] == '.' && start[2] - && !strchr(start+2, '.')) { + && !strpbrk(start+2, ".?*")) { add_suffix(&suftree, start[2], start+3); t = start; } @@ -192,6 +192,8 @@ void set_compression(const char *fname) return; while (1) { + if (isUpper(<r)) + ltr = toLower(<r); while (node->letter != ltr) { if (node->letter > ltr) return; @@ -306,7 +308,7 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY) != Z_OK) { rprintf(FERROR, "compression init failed\n"); - exit_cleanup(RERR_STREAMIO); + exit_cleanup(RERR_PROTOCOL); } if ((obuf = new_array(char, OBUF_SIZE)) == NULL) out_of_memory("send_deflated_token"); @@ -450,7 +452,7 @@ static int32 recv_deflated_token(int f, char **data) rx_strm.zfree = NULL; if (inflateInit2(&rx_strm, -15) != Z_OK) { rprintf(FERROR, "inflate init failed\n"); - exit_cleanup(RERR_STREAMIO); + exit_cleanup(RERR_PROTOCOL); } if (!(cbuf = new_array(char, MAX_DATA_COUNT)) || !(dbuf = new_array(char, AVAIL_OUT_SIZE(CHUNK_SIZE)))) @@ -598,7 +600,7 @@ static void see_deflate_token(char *buf, int32 len) rx_strm.next_out = (Bytef *)dbuf; rx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE); r = inflate(&rx_strm, Z_SYNC_FLUSH); - if (r != Z_OK) { + if (r != Z_OK && r != Z_BUF_ERROR) { rprintf(FERROR, "inflate (token) returned %d\n", r); exit_cleanup(RERR_STREAMIO); }