Added RERR_VANISHED.
[rsync/rsync.git] / sender.c
index 3d39052..7d7b586 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -42,10 +42,16 @@ void read_sum_head(int f, struct sum_struct *sum)
 
        sum->count = read_int(f);
        sum->blength = read_int(f);
-       if (protocol_version < 27)
+       if (protocol_version < 27) {
                sum->s2length = csum_length;
-       else
+       } else {
                sum->s2length = read_int(f);
+               if (sum->s2length > MD4_SUM_LENGTH) {
+                       rprintf(FERROR, "Invalid checksum length %d\n",
+                           sum->s2length);
+                       exit_cleanup(RERR_PROTOCOL);
+               }
+       }
        sum->remainder = read_int(f);
 }
 
@@ -58,7 +64,7 @@ static struct sum_struct *receive_sums(int f)
        int i;
        OFF_T offset = 0;
 
-       s = (struct sum_struct *)malloc(sizeof(*s));
+       s = new(struct sum_struct);
        if (!s) out_of_memory("receive_sums");
 
        read_sum_head(f, s);
@@ -73,7 +79,7 @@ static struct sum_struct *receive_sums(int f)
        if (s->count == 0)
                return(s);
 
-       s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
+       s->sums = new_array(struct sum_buf, s->count);
        if (!s->sums) out_of_memory("receive_sums");
 
        for (i = 0; i < (int) s->count; i++) {