View | Details | Raw Unified | Return to bug 808594
Collapse All | Expand All

(-)a/libdpe/pe_allocspace.c (-2 / +4 lines)
Lines 80-92 pe_set_image_size(Pe *pe) Link Here
80
	return 0;
80
	return 0;
81
}
81
}
82
82
83
#define EXTRA_OFFSET(offset,align) ((align - (offset % align)) % align)
84
83
static int
85
static int
84
pe_extend_file(Pe *pe, size_t size, uint32_t *new_space, int align)
86
pe_extend_file(Pe *pe, size_t size, uint32_t *new_space, int align)
85
{
87
{
86
	void *new = NULL;
88
	void *new = NULL;
87
89
88
	if (align)
90
	if (align)
89
		align = (pe->maximum_size + size) % align;
91
		align = EXTRA_OFFSET(pe->maximum_size, align);
90
	int extra = size + align;
92
	int extra = size + align;
91
93
92
	int rc = ftruncate(pe->fildes, pe->maximum_size + extra);
94
	int rc = ftruncate(pe->fildes, pe->maximum_size + extra);
Lines 119-125 pe_allocspace(Pe *pe, size_t size, uint32_t *offset) Link Here
119
121
120
	/* XXX PJFIX TODO: this should try to find space in the already
122
	/* XXX PJFIX TODO: this should try to find space in the already
121
	 * mapped regions. */
123
	 * mapped regions. */
122
	rc = pe_extend_file(pe, size, offset, 0);
124
	rc = pe_extend_file(pe, size, offset, 8);
123
	if (rc < 0)
125
	if (rc < 0)
124
		return -1;
126
		return -1;
125
	return 0;
127
	return 0;
(-)a/src/wincert.c (-1 / +9 lines)
Lines 19-24 Link Here
19
19
20
#include "pesign.h"
20
#include "pesign.h"
21
21
22
#define EXTRA_OFFSET(offset,align) ((align - (offset % align)) % align)
23
22
struct cert_list_entry {
24
struct cert_list_entry {
23
	win_certificate wc;
25
	win_certificate wc;
24
	uint8_t data[];
26
	uint8_t data[];
Lines 32-37 generate_cert_list(SECItem **signatures, int num_signatures, Link Here
32
	for (int i = 0; i < num_signatures; i++) {
34
	for (int i = 0; i < num_signatures; i++) {
33
		cl_size += sizeof (win_certificate);
35
		cl_size += sizeof (win_certificate);
34
		cl_size += signatures[i]->len;
36
		cl_size += signatures[i]->len;
37
		cl_size += EXTRA_OFFSET(cl_size, 8);
35
	}
38
	}
36
39
37
	uint8_t *data = malloc(cl_size);
40
	uint8_t *data = malloc(cl_size);
Lines 44-55 generate_cert_list(SECItem **signatures, int num_signatures, Link Here
44
	for (int i = 0; i < num_signatures; i++) {
47
	for (int i = 0; i < num_signatures; i++) {
45
		struct cert_list_entry *cle = (struct cert_list_entry *)data;
48
		struct cert_list_entry *cle = (struct cert_list_entry *)data;
46
		cle->wc.length = signatures[i]->len +
49
		cle->wc.length = signatures[i]->len +
50
			EXTRA_OFFSET(signatures[i]->len, 8) +
47
			sizeof (win_certificate);
51
			sizeof (win_certificate);
48
		cle->wc.revision = WIN_CERT_REVISION_2_0;
52
		cle->wc.revision = WIN_CERT_REVISION_2_0;
49
		cle->wc.cert_type = WIN_CERT_TYPE_PKCS_SIGNED_DATA;
53
		cle->wc.cert_type = WIN_CERT_TYPE_PKCS_SIGNED_DATA;
50
		memcpy(&cle->data[0], signatures[i]->data,
54
		memcpy(&cle->data[0], signatures[i]->data,
51
					signatures[i]->len);
55
					signatures[i]->len);
52
		data += sizeof (win_certificate) + signatures[i]->len;
56
		data += sizeof (win_certificate) + signatures[i]->len;
57
		data += EXTRA_OFFSET(signatures[i]->len, 8);
53
	}
58
	}
54
59
55
	return 0;
60
	return 0;
Lines 208-215 size_t Link Here
208
get_reserved_sig_space(cms_context *cms, Pe *pe)
213
get_reserved_sig_space(cms_context *cms, Pe *pe)
209
{
214
{
210
	size_t ret = 0;
215
	size_t ret = 0;
211
	for (int i = 0; i < cms->num_signatures; i++)
216
	for (int i = 0; i < cms->num_signatures; i++) {
212
		ret += cms->signatures[i]->len + sizeof (win_certificate);
217
		ret += cms->signatures[i]->len + sizeof (win_certificate);
218
		ret += EXTRA_OFFSET(ret, 8);
219
	}
213
	return ret;
220
	return ret;
214
}
221
}
215
222
Lines 240-245 err: Link Here
240
247
241
	ssize_t ret = res + sig.len + sizeof(win_certificate) -
248
	ssize_t ret = res + sig.len + sizeof(win_certificate) -
242
						available_cert_space(pe);
249
						available_cert_space(pe);
250
	ret += EXTRA_OFFSET(ret, 8);
243
251
244
	//free(sig.data);
252
	//free(sig.data);
245
253

Return to bug 808594