comparison mercurial/cext/revlog.c @ 48767:654baf1faa52

revlog: memset whole record instead of dealing with padding This is less error-prone. Differential Revision: https://phab.mercurial-scm.org/D12177
author pacien <pacien.trangirard@pacien.net>
date Thu, 10 Feb 2022 16:20:14 +0100
parents d9a7131648a3
children 7dd5a2c0116a
comparison
equal deleted inserted replaced
48766:d9a7131648a3 48767:654baf1faa52
156 static const long entry_v2_offset_parent_2 = 28; 156 static const long entry_v2_offset_parent_2 = 28;
157 static const long entry_v2_offset_node_id = 32; 157 static const long entry_v2_offset_node_id = 32;
158 static const long entry_v2_offset_sidedata_offset = 64; 158 static const long entry_v2_offset_sidedata_offset = 64;
159 static const long entry_v2_offset_sidedata_comp_len = 72; 159 static const long entry_v2_offset_sidedata_comp_len = 72;
160 static const long entry_v2_offset_all_comp_mode = 76; 160 static const long entry_v2_offset_all_comp_mode = 76;
161 static const long entry_v2_offset_padding_start = 77; 161 /* next free offset: 77 */
162 162
163 static const char comp_mode_inline = 2; 163 static const char comp_mode_inline = 2;
164 static const char rank_unknown = -1; 164 static const char rank_unknown = -1;
165 165
166 static void raise_revlog_error(void) 166 static void raise_revlog_error(void)
601 self->added_length = new_added_length; 601 self->added_length = new_added_length;
602 } 602 }
603 rev = self->length + self->new_length; 603 rev = self->length + self->new_length;
604 data = self->added + self->entry_size * self->new_length++; 604 data = self->added + self->entry_size * self->new_length++;
605 605
606 memset(data, 0, self->entry_size);
607
606 if (self->format_version == format_v1) { 608 if (self->format_version == format_v1) {
607 putbe32(offset_flags >> 32, data + entry_v1_offset_high); 609 putbe32(offset_flags >> 32, data + entry_v1_offset_high);
608 putbe32(offset_flags & 0xffffffffU, 610 putbe32(offset_flags & 0xffffffffU,
609 data + entry_v1_offset_offset_flags); 611 data + entry_v1_offset_offset_flags);
610 putbe32(comp_len, data + entry_v1_offset_comp_len); 612 putbe32(comp_len, data + entry_v1_offset_comp_len);
613 putbe32(link_rev, data + entry_v1_offset_link_rev); 615 putbe32(link_rev, data + entry_v1_offset_link_rev);
614 putbe32(parent_1, data + entry_v1_offset_parent_1); 616 putbe32(parent_1, data + entry_v1_offset_parent_1);
615 putbe32(parent_2, data + entry_v1_offset_parent_2); 617 putbe32(parent_2, data + entry_v1_offset_parent_2);
616 memcpy(data + entry_v1_offset_node_id, c_node_id, 618 memcpy(data + entry_v1_offset_node_id, c_node_id,
617 c_node_id_len); 619 c_node_id_len);
618 /* Padding since SHA-1 is only 20 bytes for now */
619 memset(data + entry_v1_offset_node_id + c_node_id_len, 0,
620 entry_v1_offset_node_id - c_node_id_len);
621 } else if (self->format_version == format_v2) { 620 } else if (self->format_version == format_v2) {
622 putbe32(offset_flags >> 32, data + entry_v2_offset_high); 621 putbe32(offset_flags >> 32, data + entry_v2_offset_high);
623 putbe32(offset_flags & 0xffffffffU, 622 putbe32(offset_flags & 0xffffffffU,
624 data + entry_v2_offset_offset_flags); 623 data + entry_v2_offset_offset_flags);
625 putbe32(comp_len, data + entry_v2_offset_comp_len); 624 putbe32(comp_len, data + entry_v2_offset_comp_len);
628 putbe32(link_rev, data + entry_v2_offset_link_rev); 627 putbe32(link_rev, data + entry_v2_offset_link_rev);
629 putbe32(parent_1, data + entry_v2_offset_parent_1); 628 putbe32(parent_1, data + entry_v2_offset_parent_1);
630 putbe32(parent_2, data + entry_v2_offset_parent_2); 629 putbe32(parent_2, data + entry_v2_offset_parent_2);
631 memcpy(data + entry_v2_offset_node_id, c_node_id, 630 memcpy(data + entry_v2_offset_node_id, c_node_id,
632 c_node_id_len); 631 c_node_id_len);
633 /* Padding since SHA-1 is only 20 bytes for now */
634 memset(data + entry_v2_offset_node_id + c_node_id_len, 0,
635 entry_v2_offset_node_id - c_node_id_len);
636 putbe64(sidedata_offset, 632 putbe64(sidedata_offset,
637 data + entry_v2_offset_sidedata_offset); 633 data + entry_v2_offset_sidedata_offset);
638 putbe32(sidedata_comp_len, 634 putbe32(sidedata_comp_len,
639 data + entry_v2_offset_sidedata_comp_len); 635 data + entry_v2_offset_sidedata_comp_len);
640 comp_field = data_comp_mode & 3; 636 comp_field = data_comp_mode & 3;
641 comp_field = comp_field | (sidedata_comp_mode & 3) << 2; 637 comp_field = comp_field | (sidedata_comp_mode & 3) << 2;
642 data[entry_v2_offset_all_comp_mode] = comp_field; 638 data[entry_v2_offset_all_comp_mode] = comp_field;
643 /* Padding for 96 bytes alignment */
644 memset(data + entry_v2_offset_padding_start, 0,
645 self->entry_size - entry_v2_offset_padding_start);
646 } else { 639 } else {
647 raise_revlog_error(); 640 raise_revlog_error();
648 return NULL; 641 return NULL;
649 } 642 }
650 643