Skip to content

Commit c95b3ad

Browse files
committed
Revert "unpack-objects: prevent writing of inconsistent objects"
This reverts commit d5ef408.
1 parent 9eb7a50 commit c95b3ad

File tree

2 files changed

+7
-106
lines changed

2 files changed

+7
-106
lines changed

Documentation/git-unpack-objects.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ OPTIONS
4040
and make the best effort to recover as many objects as
4141
possible.
4242

43-
--strict::
44-
Don't write objects with broken content or links.
45-
4643

4744
Author
4845
------

builtin-unpack-objects.c

Lines changed: 7 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@
77
#include "commit.h"
88
#include "tag.h"
99
#include "tree.h"
10-
#include "tree-walk.h"
1110
#include "progress.h"
1211
#include "decorate.h"
13-
#include "fsck.h"
1412

15-
static int dry_run, quiet, recover, has_errors, strict;
16-
static const char unpack_usage[] = "git-unpack-objects [-n] [-q] [-r] [--strict] < pack-file";
13+
static int dry_run, quiet, recover, has_errors;
14+
static const char unpack_usage[] = "git-unpack-objects [-n] [-q] [-r] < pack-file";
1715

1816
/* We always read in 4kB chunks. */
1917
static unsigned char buffer[4096];
@@ -33,16 +31,6 @@ static struct obj_buffer *lookup_object_buffer(struct object *base)
3331
return lookup_decoration(&obj_decorate, base);
3432
}
3533

36-
static void add_object_buffer(struct object *object, char *buffer, unsigned long size)
37-
{
38-
struct obj_buffer *obj;
39-
obj = xcalloc(1, sizeof(struct obj_buffer));
40-
obj->buffer = buffer;
41-
obj->size = size;
42-
if (add_decoration(&obj_decorate, object, obj))
43-
die("object %s tried to add buffer twice!", sha1_to_hex(object->sha1));
44-
}
45-
4634
/*
4735
* Make sure at least "min" bytes are available in the buffer, and
4836
* return the pointer to the buffer.
@@ -146,95 +134,19 @@ static void add_delta_to_list(unsigned nr, unsigned const char *base_sha1,
146134
struct obj_info {
147135
off_t offset;
148136
unsigned char sha1[20];
149-
struct object *obj;
150137
};
151138

152-
#define FLAG_OPEN (1u<<20)
153-
#define FLAG_WRITTEN (1u<<21)
154-
155139
static struct obj_info *obj_list;
156-
unsigned nr_objects;
157-
158-
static void write_cached_object(struct object *obj)
159-
{
160-
unsigned char sha1[20];
161-
struct obj_buffer *obj_buf = lookup_object_buffer(obj);
162-
if (write_sha1_file(obj_buf->buffer, obj_buf->size, typename(obj->type), sha1) < 0)
163-
die("failed to write object %s", sha1_to_hex(obj->sha1));
164-
obj->flags |= FLAG_WRITTEN;
165-
}
166-
167-
static int check_object(struct object *obj, int type, void *data)
168-
{
169-
if (!obj)
170-
return 0;
171-
172-
if (obj->flags & FLAG_WRITTEN)
173-
return 1;
174-
175-
if (type != OBJ_ANY && obj->type != type)
176-
die("object type mismatch");
177-
178-
if (!(obj->flags & FLAG_OPEN)) {
179-
unsigned long size;
180-
int type = sha1_object_info(obj->sha1, &size);
181-
if (type != obj->type || type <= 0)
182-
die("object of unexpected type");
183-
obj->flags |= FLAG_WRITTEN;
184-
return 1;
185-
}
186-
187-
if (fsck_object(obj, 1, fsck_error_function))
188-
die("Error in object");
189-
if (!fsck_walk(obj, check_object, 0))
190-
die("Error on reachable objects of %s", sha1_to_hex(obj->sha1));
191-
write_cached_object(obj);
192-
return 1;
193-
}
194-
195-
static void write_rest(void)
196-
{
197-
unsigned i;
198-
for (i = 0; i < nr_objects; i++)
199-
check_object(obj_list[i].obj, OBJ_ANY, 0);
200-
}
201140

202141
static void added_object(unsigned nr, enum object_type type,
203142
void *data, unsigned long size);
204143

205144
static void write_object(unsigned nr, enum object_type type,
206145
void *buf, unsigned long size)
207146
{
147+
if (write_sha1_file(buf, size, typename(type), obj_list[nr].sha1) < 0)
148+
die("failed to write object");
208149
added_object(nr, type, buf, size);
209-
if (!strict) {
210-
if (write_sha1_file(buf, size, typename(type), obj_list[nr].sha1) < 0)
211-
die("failed to write object");
212-
free(buf);
213-
obj_list[nr].obj = 0;
214-
} else if (type == OBJ_BLOB) {
215-
struct blob *blob;
216-
if (write_sha1_file(buf, size, typename(type), obj_list[nr].sha1) < 0)
217-
die("failed to write object");
218-
free(buf);
219-
220-
blob = lookup_blob(obj_list[nr].sha1);
221-
if (blob)
222-
blob->object.flags |= FLAG_WRITTEN;
223-
else
224-
die("invalid blob object");
225-
obj_list[nr].obj = 0;
226-
} else {
227-
struct object *obj;
228-
int eaten;
229-
hash_sha1_file(buf, size, typename(type), obj_list[nr].sha1);
230-
obj = parse_object_buffer(obj_list[nr].sha1, type, size, buf, &eaten);
231-
if (!obj)
232-
die("invalid %s", typename(type));
233-
/* buf is stored via add_object_buffer and in obj, if its a tree or commit */
234-
add_object_buffer(obj, buf, size);
235-
obj->flags |= FLAG_OPEN;
236-
obj_list[nr].obj = obj;
237-
}
238150
}
239151

240152
static void resolve_delta(unsigned nr, enum object_type type,
@@ -251,6 +163,7 @@ static void resolve_delta(unsigned nr, enum object_type type,
251163
die("failed to apply delta");
252164
free(delta);
253165
write_object(nr, type, result, result_size);
166+
free(result);
254167
}
255168

256169
static void added_object(unsigned nr, enum object_type type,
@@ -280,8 +193,7 @@ static void unpack_non_delta_entry(enum object_type type, unsigned long size,
280193

281194
if (!dry_run && buf)
282195
write_object(nr, type, buf, size);
283-
else
284-
free(buf);
196+
free(buf);
285197
}
286198

287199
static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
@@ -424,8 +336,7 @@ static void unpack_all(void)
424336
int i;
425337
struct progress *progress = NULL;
426338
struct pack_header *hdr = fill(sizeof(struct pack_header));
427-
428-
nr_objects = ntohl(hdr->hdr_entries);
339+
unsigned nr_objects = ntohl(hdr->hdr_entries);
429340

430341
if (ntohl(hdr->hdr_signature) != PACK_SIGNATURE)
431342
die("bad pack file");
@@ -436,7 +347,6 @@ static void unpack_all(void)
436347
if (!quiet)
437348
progress = start_progress("Unpacking objects", nr_objects);
438349
obj_list = xmalloc(nr_objects * sizeof(*obj_list));
439-
memset(obj_list, 0, nr_objects * sizeof(*obj_list));
440350
for (i = 0; i < nr_objects; i++) {
441351
unpack_one(i);
442352
display_progress(progress, i + 1);
@@ -472,10 +382,6 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
472382
recover = 1;
473383
continue;
474384
}
475-
if (!strcmp(arg, "--strict")) {
476-
strict = 1;
477-
continue;
478-
}
479385
if (!prefixcmp(arg, "--pack_header=")) {
480386
struct pack_header *hdr;
481387
char *c;
@@ -501,8 +407,6 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
501407
unpack_all();
502408
SHA1_Update(&ctx, buffer, offset);
503409
SHA1_Final(sha1, &ctx);
504-
if (strict)
505-
write_rest();
506410
if (hashcmp(fill(20), sha1))
507411
die("final sha1 did not match");
508412
use(20);

0 commit comments

Comments
 (0)