pack-objects: refactor unpack-unreachable expiration check
[git.git] / builtin / receive-pack.c
bloba01ac2096a70fcfbe4f206cca1b06ded1a1daffc
1 #include "builtin.h"
2 #include "pack.h"
3 #include "refs.h"
4 #include "pkt-line.h"
5 #include "sideband.h"
6 #include "run-command.h"
7 #include "exec_cmd.h"
8 #include "commit.h"
9 #include "object.h"
10 #include "remote.h"
11 #include "connect.h"
12 #include "transport.h"
13 #include "string-list.h"
14 #include "sha1-array.h"
15 #include "connected.h"
16 #include "argv-array.h"
17 #include "version.h"
18 #include "tag.h"
19 #include "gpg-interface.h"
20 #include "sigchain.h"
22 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
24 enum deny_action {
25 DENY_UNCONFIGURED,
26 DENY_IGNORE,
27 DENY_WARN,
28 DENY_REFUSE
31 static int deny_deletes;
32 static int deny_non_fast_forwards;
33 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
34 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
35 static int receive_fsck_objects = -1;
36 static int transfer_fsck_objects = -1;
37 static int receive_unpack_limit = -1;
38 static int transfer_unpack_limit = -1;
39 static int unpack_limit = 100;
40 static int report_status;
41 static int use_sideband;
42 static int quiet;
43 static int prefer_ofs_delta = 1;
44 static int auto_update_server_info;
45 static int auto_gc = 1;
46 static int fix_thin = 1;
47 static int stateless_rpc;
48 static const char *service_dir;
49 static const char *head_name;
50 static void *head_name_to_free;
51 static int sent_capabilities;
52 static int shallow_update;
53 static const char *alt_shallow_file;
54 static struct strbuf push_cert = STRBUF_INIT;
55 static unsigned char push_cert_sha1[20];
56 static struct signature_check sigcheck;
57 static const char *push_cert_nonce;
58 static const char *cert_nonce_seed;
60 static const char *NONCE_UNSOLICITED = "UNSOLICITED";
61 static const char *NONCE_BAD = "BAD";
62 static const char *NONCE_MISSING = "MISSING";
63 static const char *NONCE_OK = "OK";
64 static const char *NONCE_SLOP = "SLOP";
65 static const char *nonce_status;
66 static long nonce_stamp_slop;
67 static unsigned long nonce_stamp_slop_limit;
69 static enum deny_action parse_deny_action(const char *var, const char *value)
71 if (value) {
72 if (!strcasecmp(value, "ignore"))
73 return DENY_IGNORE;
74 if (!strcasecmp(value, "warn"))
75 return DENY_WARN;
76 if (!strcasecmp(value, "refuse"))
77 return DENY_REFUSE;
79 if (git_config_bool(var, value))
80 return DENY_REFUSE;
81 return DENY_IGNORE;
84 static int receive_pack_config(const char *var, const char *value, void *cb)
86 int status = parse_hide_refs_config(var, value, "receive");
88 if (status)
89 return status;
91 if (strcmp(var, "receive.denydeletes") == 0) {
92 deny_deletes = git_config_bool(var, value);
93 return 0;
96 if (strcmp(var, "receive.denynonfastforwards") == 0) {
97 deny_non_fast_forwards = git_config_bool(var, value);
98 return 0;
101 if (strcmp(var, "receive.unpacklimit") == 0) {
102 receive_unpack_limit = git_config_int(var, value);
103 return 0;
106 if (strcmp(var, "transfer.unpacklimit") == 0) {
107 transfer_unpack_limit = git_config_int(var, value);
108 return 0;
111 if (strcmp(var, "receive.fsckobjects") == 0) {
112 receive_fsck_objects = git_config_bool(var, value);
113 return 0;
116 if (strcmp(var, "transfer.fsckobjects") == 0) {
117 transfer_fsck_objects = git_config_bool(var, value);
118 return 0;
121 if (!strcmp(var, "receive.denycurrentbranch")) {
122 deny_current_branch = parse_deny_action(var, value);
123 return 0;
126 if (strcmp(var, "receive.denydeletecurrent") == 0) {
127 deny_delete_current = parse_deny_action(var, value);
128 return 0;
131 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
132 prefer_ofs_delta = git_config_bool(var, value);
133 return 0;
136 if (strcmp(var, "receive.updateserverinfo") == 0) {
137 auto_update_server_info = git_config_bool(var, value);
138 return 0;
141 if (strcmp(var, "receive.autogc") == 0) {
142 auto_gc = git_config_bool(var, value);
143 return 0;
146 if (strcmp(var, "receive.shallowupdate") == 0) {
147 shallow_update = git_config_bool(var, value);
148 return 0;
151 if (strcmp(var, "receive.certnonceseed") == 0)
152 return git_config_string(&cert_nonce_seed, var, value);
154 if (strcmp(var, "receive.certnonceslop") == 0) {
155 nonce_stamp_slop_limit = git_config_ulong(var, value);
156 return 0;
159 return git_default_config(var, value, cb);
162 static void show_ref(const char *path, const unsigned char *sha1)
164 if (ref_is_hidden(path))
165 return;
167 if (sent_capabilities) {
168 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
169 } else {
170 struct strbuf cap = STRBUF_INIT;
172 strbuf_addstr(&cap,
173 "report-status delete-refs side-band-64k quiet");
174 if (prefer_ofs_delta)
175 strbuf_addstr(&cap, " ofs-delta");
176 if (push_cert_nonce)
177 strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
178 strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
179 packet_write(1, "%s %s%c%s\n",
180 sha1_to_hex(sha1), path, 0, cap.buf);
181 strbuf_release(&cap);
182 sent_capabilities = 1;
186 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
188 path = strip_namespace(path);
190 * Advertise refs outside our current namespace as ".have"
191 * refs, so that the client can use them to minimize data
192 * transfer but will otherwise ignore them. This happens to
193 * cover ".have" that are thrown in by add_one_alternate_ref()
194 * to mark histories that are complete in our alternates as
195 * well.
197 if (!path)
198 path = ".have";
199 show_ref(path, sha1);
200 return 0;
203 static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
205 show_ref(".have", sha1);
208 static void collect_one_alternate_ref(const struct ref *ref, void *data)
210 struct sha1_array *sa = data;
211 sha1_array_append(sa, ref->old_sha1);
214 static void write_head_info(void)
216 struct sha1_array sa = SHA1_ARRAY_INIT;
217 for_each_alternate_ref(collect_one_alternate_ref, &sa);
218 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
219 sha1_array_clear(&sa);
220 for_each_ref(show_ref_cb, NULL);
221 if (!sent_capabilities)
222 show_ref("capabilities^{}", null_sha1);
224 advertise_shallow_grafts(1);
226 /* EOF */
227 packet_flush(1);
230 struct command {
231 struct command *next;
232 const char *error_string;
233 unsigned int skip_update:1,
234 did_not_exist:1;
235 int index;
236 unsigned char old_sha1[20];
237 unsigned char new_sha1[20];
238 char ref_name[FLEX_ARRAY]; /* more */
241 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
242 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
244 static void report_message(const char *prefix, const char *err, va_list params)
246 int sz = strlen(prefix);
247 char msg[4096];
249 strncpy(msg, prefix, sz);
250 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
251 if (sz > (sizeof(msg) - 1))
252 sz = sizeof(msg) - 1;
253 msg[sz++] = '\n';
255 if (use_sideband)
256 send_sideband(1, 2, msg, sz, use_sideband);
257 else
258 xwrite(2, msg, sz);
261 static void rp_warning(const char *err, ...)
263 va_list params;
264 va_start(params, err);
265 report_message("warning: ", err, params);
266 va_end(params);
269 static void rp_error(const char *err, ...)
271 va_list params;
272 va_start(params, err);
273 report_message("error: ", err, params);
274 va_end(params);
277 static int copy_to_sideband(int in, int out, void *arg)
279 char data[128];
280 while (1) {
281 ssize_t sz = xread(in, data, sizeof(data));
282 if (sz <= 0)
283 break;
284 send_sideband(1, 2, data, sz, use_sideband);
286 close(in);
287 return 0;
290 #define HMAC_BLOCK_SIZE 64
292 static void hmac_sha1(unsigned char *out,
293 const char *key_in, size_t key_len,
294 const char *text, size_t text_len)
296 unsigned char key[HMAC_BLOCK_SIZE];
297 unsigned char k_ipad[HMAC_BLOCK_SIZE];
298 unsigned char k_opad[HMAC_BLOCK_SIZE];
299 int i;
300 git_SHA_CTX ctx;
302 /* RFC 2104 2. (1) */
303 memset(key, '\0', HMAC_BLOCK_SIZE);
304 if (HMAC_BLOCK_SIZE < key_len) {
305 git_SHA1_Init(&ctx);
306 git_SHA1_Update(&ctx, key_in, key_len);
307 git_SHA1_Final(key, &ctx);
308 } else {
309 memcpy(key, key_in, key_len);
312 /* RFC 2104 2. (2) & (5) */
313 for (i = 0; i < sizeof(key); i++) {
314 k_ipad[i] = key[i] ^ 0x36;
315 k_opad[i] = key[i] ^ 0x5c;
318 /* RFC 2104 2. (3) & (4) */
319 git_SHA1_Init(&ctx);
320 git_SHA1_Update(&ctx, k_ipad, sizeof(k_ipad));
321 git_SHA1_Update(&ctx, text, text_len);
322 git_SHA1_Final(out, &ctx);
324 /* RFC 2104 2. (6) & (7) */
325 git_SHA1_Init(&ctx);
326 git_SHA1_Update(&ctx, k_opad, sizeof(k_opad));
327 git_SHA1_Update(&ctx, out, 20);
328 git_SHA1_Final(out, &ctx);
331 static char *prepare_push_cert_nonce(const char *path, unsigned long stamp)
333 struct strbuf buf = STRBUF_INIT;
334 unsigned char sha1[20];
336 strbuf_addf(&buf, "%s:%lu", path, stamp);
337 hmac_sha1(sha1, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));;
338 strbuf_release(&buf);
340 /* RFC 2104 5. HMAC-SHA1-80 */
341 strbuf_addf(&buf, "%lu-%.*s", stamp, 20, sha1_to_hex(sha1));
342 return strbuf_detach(&buf, NULL);
346 * NEEDSWORK: reuse find_commit_header() from jk/commit-author-parsing
347 * after dropping "_commit" from its name and possibly moving it out
348 * of commit.c
350 static char *find_header(const char *msg, size_t len, const char *key)
352 int key_len = strlen(key);
353 const char *line = msg;
355 while (line && line < msg + len) {
356 const char *eol = strchrnul(line, '\n');
358 if ((msg + len <= eol) || line == eol)
359 return NULL;
360 if (line + key_len < eol &&
361 !memcmp(line, key, key_len) && line[key_len] == ' ') {
362 int offset = key_len + 1;
363 return xmemdupz(line + offset, (eol - line) - offset);
365 line = *eol ? eol + 1 : NULL;
367 return NULL;
370 static const char *check_nonce(const char *buf, size_t len)
372 char *nonce = find_header(buf, len, "nonce");
373 unsigned long stamp, ostamp;
374 char *bohmac, *expect = NULL;
375 const char *retval = NONCE_BAD;
377 if (!nonce) {
378 retval = NONCE_MISSING;
379 goto leave;
380 } else if (!push_cert_nonce) {
381 retval = NONCE_UNSOLICITED;
382 goto leave;
383 } else if (!strcmp(push_cert_nonce, nonce)) {
384 retval = NONCE_OK;
385 goto leave;
388 if (!stateless_rpc) {
389 /* returned nonce MUST match what we gave out earlier */
390 retval = NONCE_BAD;
391 goto leave;
395 * In stateless mode, we may be receiving a nonce issued by
396 * another instance of the server that serving the same
397 * repository, and the timestamps may not match, but the
398 * nonce-seed and dir should match, so we can recompute and
399 * report the time slop.
401 * In addition, when a nonce issued by another instance has
402 * timestamp within receive.certnonceslop seconds, we pretend
403 * as if we issued that nonce when reporting to the hook.
406 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
407 if (*nonce <= '0' || '9' < *nonce) {
408 retval = NONCE_BAD;
409 goto leave;
411 stamp = strtoul(nonce, &bohmac, 10);
412 if (bohmac == nonce || bohmac[0] != '-') {
413 retval = NONCE_BAD;
414 goto leave;
417 expect = prepare_push_cert_nonce(service_dir, stamp);
418 if (strcmp(expect, nonce)) {
419 /* Not what we would have signed earlier */
420 retval = NONCE_BAD;
421 goto leave;
425 * By how many seconds is this nonce stale? Negative value
426 * would mean it was issued by another server with its clock
427 * skewed in the future.
429 ostamp = strtoul(push_cert_nonce, NULL, 10);
430 nonce_stamp_slop = (long)ostamp - (long)stamp;
432 if (nonce_stamp_slop_limit &&
433 abs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
435 * Pretend as if the received nonce (which passes the
436 * HMAC check, so it is not a forged by third-party)
437 * is what we issued.
439 free((void *)push_cert_nonce);
440 push_cert_nonce = xstrdup(nonce);
441 retval = NONCE_OK;
442 } else {
443 retval = NONCE_SLOP;
446 leave:
447 free(nonce);
448 free(expect);
449 return retval;
452 static void prepare_push_cert_sha1(struct child_process *proc)
454 static int already_done;
455 struct argv_array env = ARGV_ARRAY_INIT;
457 if (!push_cert.len)
458 return;
460 if (!already_done) {
461 struct strbuf gpg_output = STRBUF_INIT;
462 struct strbuf gpg_status = STRBUF_INIT;
463 int bogs /* beginning_of_gpg_sig */;
465 already_done = 1;
466 if (write_sha1_file(push_cert.buf, push_cert.len, "blob", push_cert_sha1))
467 hashclr(push_cert_sha1);
469 memset(&sigcheck, '\0', sizeof(sigcheck));
470 sigcheck.result = 'N';
472 bogs = parse_signature(push_cert.buf, push_cert.len);
473 if (verify_signed_buffer(push_cert.buf, bogs,
474 push_cert.buf + bogs, push_cert.len - bogs,
475 &gpg_output, &gpg_status) < 0) {
476 ; /* error running gpg */
477 } else {
478 sigcheck.payload = push_cert.buf;
479 sigcheck.gpg_output = gpg_output.buf;
480 sigcheck.gpg_status = gpg_status.buf;
481 parse_gpg_output(&sigcheck);
484 strbuf_release(&gpg_output);
485 strbuf_release(&gpg_status);
486 nonce_status = check_nonce(push_cert.buf, bogs);
488 if (!is_null_sha1(push_cert_sha1)) {
489 argv_array_pushf(&env, "GIT_PUSH_CERT=%s", sha1_to_hex(push_cert_sha1));
490 argv_array_pushf(&env, "GIT_PUSH_CERT_SIGNER=%s",
491 sigcheck.signer ? sigcheck.signer : "");
492 argv_array_pushf(&env, "GIT_PUSH_CERT_KEY=%s",
493 sigcheck.key ? sigcheck.key : "");
494 argv_array_pushf(&env, "GIT_PUSH_CERT_STATUS=%c", sigcheck.result);
495 if (push_cert_nonce) {
496 argv_array_pushf(&env, "GIT_PUSH_CERT_NONCE=%s", push_cert_nonce);
497 argv_array_pushf(&env, "GIT_PUSH_CERT_NONCE_STATUS=%s", nonce_status);
498 if (nonce_status == NONCE_SLOP)
499 argv_array_pushf(&env, "GIT_PUSH_CERT_NONCE_SLOP=%ld",
500 nonce_stamp_slop);
502 proc->env = env.argv;
506 typedef int (*feed_fn)(void *, const char **, size_t *);
507 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
509 struct child_process proc = CHILD_PROCESS_INIT;
510 struct async muxer;
511 const char *argv[2];
512 int code;
514 argv[0] = find_hook(hook_name);
515 if (!argv[0])
516 return 0;
518 argv[1] = NULL;
520 proc.argv = argv;
521 proc.in = -1;
522 proc.stdout_to_stderr = 1;
524 prepare_push_cert_sha1(&proc);
526 if (use_sideband) {
527 memset(&muxer, 0, sizeof(muxer));
528 muxer.proc = copy_to_sideband;
529 muxer.in = -1;
530 code = start_async(&muxer);
531 if (code)
532 return code;
533 proc.err = muxer.in;
536 code = start_command(&proc);
537 if (code) {
538 if (use_sideband)
539 finish_async(&muxer);
540 return code;
543 sigchain_push(SIGPIPE, SIG_IGN);
545 while (1) {
546 const char *buf;
547 size_t n;
548 if (feed(feed_state, &buf, &n))
549 break;
550 if (write_in_full(proc.in, buf, n) != n)
551 break;
553 close(proc.in);
554 if (use_sideband)
555 finish_async(&muxer);
557 sigchain_pop(SIGPIPE);
559 return finish_command(&proc);
562 struct receive_hook_feed_state {
563 struct command *cmd;
564 int skip_broken;
565 struct strbuf buf;
568 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
570 struct receive_hook_feed_state *state = state_;
571 struct command *cmd = state->cmd;
573 while (cmd &&
574 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
575 cmd = cmd->next;
576 if (!cmd)
577 return -1; /* EOF */
578 strbuf_reset(&state->buf);
579 strbuf_addf(&state->buf, "%s %s %s\n",
580 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
581 cmd->ref_name);
582 state->cmd = cmd->next;
583 if (bufp) {
584 *bufp = state->buf.buf;
585 *sizep = state->buf.len;
587 return 0;
590 static int run_receive_hook(struct command *commands, const char *hook_name,
591 int skip_broken)
593 struct receive_hook_feed_state state;
594 int status;
596 strbuf_init(&state.buf, 0);
597 state.cmd = commands;
598 state.skip_broken = skip_broken;
599 if (feed_receive_hook(&state, NULL, NULL))
600 return 0;
601 state.cmd = commands;
602 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
603 strbuf_release(&state.buf);
604 return status;
607 static int run_update_hook(struct command *cmd)
609 const char *argv[5];
610 struct child_process proc = CHILD_PROCESS_INIT;
611 int code;
613 argv[0] = find_hook("update");
614 if (!argv[0])
615 return 0;
617 argv[1] = cmd->ref_name;
618 argv[2] = sha1_to_hex(cmd->old_sha1);
619 argv[3] = sha1_to_hex(cmd->new_sha1);
620 argv[4] = NULL;
622 proc.no_stdin = 1;
623 proc.stdout_to_stderr = 1;
624 proc.err = use_sideband ? -1 : 0;
625 proc.argv = argv;
627 code = start_command(&proc);
628 if (code)
629 return code;
630 if (use_sideband)
631 copy_to_sideband(proc.err, -1, NULL);
632 return finish_command(&proc);
635 static int is_ref_checked_out(const char *ref)
637 if (is_bare_repository())
638 return 0;
640 if (!head_name)
641 return 0;
642 return !strcmp(head_name, ref);
645 static char *refuse_unconfigured_deny_msg[] = {
646 "By default, updating the current branch in a non-bare repository",
647 "is denied, because it will make the index and work tree inconsistent",
648 "with what you pushed, and will require 'git reset --hard' to match",
649 "the work tree to HEAD.",
651 "You can set 'receive.denyCurrentBranch' configuration variable to",
652 "'ignore' or 'warn' in the remote repository to allow pushing into",
653 "its current branch; however, this is not recommended unless you",
654 "arranged to update its work tree to match what you pushed in some",
655 "other way.",
657 "To squelch this message and still keep the default behaviour, set",
658 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
661 static void refuse_unconfigured_deny(void)
663 int i;
664 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
665 rp_error("%s", refuse_unconfigured_deny_msg[i]);
668 static char *refuse_unconfigured_deny_delete_current_msg[] = {
669 "By default, deleting the current branch is denied, because the next",
670 "'git clone' won't result in any file checked out, causing confusion.",
672 "You can set 'receive.denyDeleteCurrent' configuration variable to",
673 "'warn' or 'ignore' in the remote repository to allow deleting the",
674 "current branch, with or without a warning message.",
676 "To squelch this message, you can set it to 'refuse'."
679 static void refuse_unconfigured_deny_delete_current(void)
681 int i;
682 for (i = 0;
683 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
684 i++)
685 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
688 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
689 static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
691 static struct lock_file shallow_lock;
692 struct sha1_array extra = SHA1_ARRAY_INIT;
693 const char *alt_file;
694 uint32_t mask = 1 << (cmd->index % 32);
695 int i;
697 trace_printf_key(&trace_shallow,
698 "shallow: update_shallow_ref %s\n", cmd->ref_name);
699 for (i = 0; i < si->shallow->nr; i++)
700 if (si->used_shallow[i] &&
701 (si->used_shallow[i][cmd->index / 32] & mask) &&
702 !delayed_reachability_test(si, i))
703 sha1_array_append(&extra, si->shallow->sha1[i]);
705 setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
706 if (check_shallow_connected(command_singleton_iterator,
707 0, cmd, alt_file)) {
708 rollback_lock_file(&shallow_lock);
709 sha1_array_clear(&extra);
710 return -1;
713 commit_lock_file(&shallow_lock);
716 * Make sure setup_alternate_shallow() for the next ref does
717 * not lose these new roots..
719 for (i = 0; i < extra.nr; i++)
720 register_shallow(extra.sha1[i]);
722 si->shallow_ref[cmd->index] = 0;
723 sha1_array_clear(&extra);
724 return 0;
727 static const char *update(struct command *cmd, struct shallow_info *si)
729 const char *name = cmd->ref_name;
730 struct strbuf namespaced_name_buf = STRBUF_INIT;
731 const char *namespaced_name;
732 unsigned char *old_sha1 = cmd->old_sha1;
733 unsigned char *new_sha1 = cmd->new_sha1;
735 /* only refs/... are allowed */
736 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
737 rp_error("refusing to create funny ref '%s' remotely", name);
738 return "funny refname";
741 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
742 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
744 if (is_ref_checked_out(namespaced_name)) {
745 switch (deny_current_branch) {
746 case DENY_IGNORE:
747 break;
748 case DENY_WARN:
749 rp_warning("updating the current branch");
750 break;
751 case DENY_REFUSE:
752 case DENY_UNCONFIGURED:
753 rp_error("refusing to update checked out branch: %s", name);
754 if (deny_current_branch == DENY_UNCONFIGURED)
755 refuse_unconfigured_deny();
756 return "branch is currently checked out";
760 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
761 error("unpack should have generated %s, "
762 "but I can't find it!", sha1_to_hex(new_sha1));
763 return "bad pack";
766 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
767 if (deny_deletes && starts_with(name, "refs/heads/")) {
768 rp_error("denying ref deletion for %s", name);
769 return "deletion prohibited";
772 if (!strcmp(namespaced_name, head_name)) {
773 switch (deny_delete_current) {
774 case DENY_IGNORE:
775 break;
776 case DENY_WARN:
777 rp_warning("deleting the current branch");
778 break;
779 case DENY_REFUSE:
780 case DENY_UNCONFIGURED:
781 if (deny_delete_current == DENY_UNCONFIGURED)
782 refuse_unconfigured_deny_delete_current();
783 rp_error("refusing to delete the current branch: %s", name);
784 return "deletion of the current branch prohibited";
789 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
790 !is_null_sha1(old_sha1) &&
791 starts_with(name, "refs/heads/")) {
792 struct object *old_object, *new_object;
793 struct commit *old_commit, *new_commit;
795 old_object = parse_object(old_sha1);
796 new_object = parse_object(new_sha1);
798 if (!old_object || !new_object ||
799 old_object->type != OBJ_COMMIT ||
800 new_object->type != OBJ_COMMIT) {
801 error("bad sha1 objects for %s", name);
802 return "bad ref";
804 old_commit = (struct commit *)old_object;
805 new_commit = (struct commit *)new_object;
806 if (!in_merge_bases(old_commit, new_commit)) {
807 rp_error("denying non-fast-forward %s"
808 " (you should pull first)", name);
809 return "non-fast-forward";
812 if (run_update_hook(cmd)) {
813 rp_error("hook declined to update %s", name);
814 return "hook declined";
817 if (is_null_sha1(new_sha1)) {
818 if (!parse_object(old_sha1)) {
819 old_sha1 = NULL;
820 if (ref_exists(name)) {
821 rp_warning("Allowing deletion of corrupt ref.");
822 } else {
823 rp_warning("Deleting a non-existent ref.");
824 cmd->did_not_exist = 1;
827 if (delete_ref(namespaced_name, old_sha1, 0)) {
828 rp_error("failed to delete %s", name);
829 return "failed to delete";
831 return NULL; /* good */
833 else {
834 struct strbuf err = STRBUF_INIT;
835 struct ref_transaction *transaction;
837 if (shallow_update && si->shallow_ref[cmd->index] &&
838 update_shallow_ref(cmd, si))
839 return "shallow error";
841 transaction = ref_transaction_begin(&err);
842 if (!transaction ||
843 ref_transaction_update(transaction, namespaced_name,
844 new_sha1, old_sha1, 0, 1, &err) ||
845 ref_transaction_commit(transaction, "push", &err)) {
846 ref_transaction_free(transaction);
848 rp_error("%s", err.buf);
849 strbuf_release(&err);
850 return "failed to update ref";
853 ref_transaction_free(transaction);
854 strbuf_release(&err);
855 return NULL; /* good */
859 static void run_update_post_hook(struct command *commands)
861 struct command *cmd;
862 int argc;
863 const char **argv;
864 struct child_process proc = CHILD_PROCESS_INIT;
865 char *hook;
867 hook = find_hook("post-update");
868 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
869 if (cmd->error_string || cmd->did_not_exist)
870 continue;
871 argc++;
873 if (!argc || !hook)
874 return;
876 argv = xmalloc(sizeof(*argv) * (2 + argc));
877 argv[0] = hook;
879 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
880 if (cmd->error_string || cmd->did_not_exist)
881 continue;
882 argv[argc] = xstrdup(cmd->ref_name);
883 argc++;
885 argv[argc] = NULL;
887 proc.no_stdin = 1;
888 proc.stdout_to_stderr = 1;
889 proc.err = use_sideband ? -1 : 0;
890 proc.argv = argv;
892 if (!start_command(&proc)) {
893 if (use_sideband)
894 copy_to_sideband(proc.err, -1, NULL);
895 finish_command(&proc);
899 static void check_aliased_update(struct command *cmd, struct string_list *list)
901 struct strbuf buf = STRBUF_INIT;
902 const char *dst_name;
903 struct string_list_item *item;
904 struct command *dst_cmd;
905 unsigned char sha1[20];
906 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
907 int flag;
909 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
910 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
911 strbuf_release(&buf);
913 if (!(flag & REF_ISSYMREF))
914 return;
916 dst_name = strip_namespace(dst_name);
917 if (!dst_name) {
918 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
919 cmd->skip_update = 1;
920 cmd->error_string = "broken symref";
921 return;
924 if ((item = string_list_lookup(list, dst_name)) == NULL)
925 return;
927 cmd->skip_update = 1;
929 dst_cmd = (struct command *) item->util;
931 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
932 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
933 return;
935 dst_cmd->skip_update = 1;
937 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
938 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
939 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
940 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
941 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
942 " its target '%s' (%s..%s)",
943 cmd->ref_name, cmd_oldh, cmd_newh,
944 dst_cmd->ref_name, dst_oldh, dst_newh);
946 cmd->error_string = dst_cmd->error_string =
947 "inconsistent aliased update";
950 static void check_aliased_updates(struct command *commands)
952 struct command *cmd;
953 struct string_list ref_list = STRING_LIST_INIT_NODUP;
955 for (cmd = commands; cmd; cmd = cmd->next) {
956 struct string_list_item *item =
957 string_list_append(&ref_list, cmd->ref_name);
958 item->util = (void *)cmd;
960 sort_string_list(&ref_list);
962 for (cmd = commands; cmd; cmd = cmd->next) {
963 if (!cmd->error_string)
964 check_aliased_update(cmd, &ref_list);
967 string_list_clear(&ref_list, 0);
970 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
972 struct command **cmd_list = cb_data;
973 struct command *cmd = *cmd_list;
975 if (!cmd || is_null_sha1(cmd->new_sha1))
976 return -1; /* end of list */
977 *cmd_list = NULL; /* this returns only one */
978 hashcpy(sha1, cmd->new_sha1);
979 return 0;
982 static void set_connectivity_errors(struct command *commands,
983 struct shallow_info *si)
985 struct command *cmd;
987 for (cmd = commands; cmd; cmd = cmd->next) {
988 struct command *singleton = cmd;
989 if (shallow_update && si->shallow_ref[cmd->index])
990 /* to be checked in update_shallow_ref() */
991 continue;
992 if (!check_everything_connected(command_singleton_iterator,
993 0, &singleton))
994 continue;
995 cmd->error_string = "missing necessary objects";
999 struct iterate_data {
1000 struct command *cmds;
1001 struct shallow_info *si;
1004 static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
1006 struct iterate_data *data = cb_data;
1007 struct command **cmd_list = &data->cmds;
1008 struct command *cmd = *cmd_list;
1010 for (; cmd; cmd = cmd->next) {
1011 if (shallow_update && data->si->shallow_ref[cmd->index])
1012 /* to be checked in update_shallow_ref() */
1013 continue;
1014 if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
1015 hashcpy(sha1, cmd->new_sha1);
1016 *cmd_list = cmd->next;
1017 return 0;
1020 *cmd_list = NULL;
1021 return -1; /* end of list */
1024 static void reject_updates_to_hidden(struct command *commands)
1026 struct command *cmd;
1028 for (cmd = commands; cmd; cmd = cmd->next) {
1029 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
1030 continue;
1031 if (is_null_sha1(cmd->new_sha1))
1032 cmd->error_string = "deny deleting a hidden ref";
1033 else
1034 cmd->error_string = "deny updating a hidden ref";
1038 static void execute_commands(struct command *commands,
1039 const char *unpacker_error,
1040 struct shallow_info *si)
1042 int checked_connectivity;
1043 struct command *cmd;
1044 unsigned char sha1[20];
1045 struct iterate_data data;
1047 if (unpacker_error) {
1048 for (cmd = commands; cmd; cmd = cmd->next)
1049 cmd->error_string = "unpacker error";
1050 return;
1053 data.cmds = commands;
1054 data.si = si;
1055 if (check_everything_connected(iterate_receive_command_list, 0, &data))
1056 set_connectivity_errors(commands, si);
1058 reject_updates_to_hidden(commands);
1060 if (run_receive_hook(commands, "pre-receive", 0)) {
1061 for (cmd = commands; cmd; cmd = cmd->next) {
1062 if (!cmd->error_string)
1063 cmd->error_string = "pre-receive hook declined";
1065 return;
1068 check_aliased_updates(commands);
1070 free(head_name_to_free);
1071 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
1073 checked_connectivity = 1;
1074 for (cmd = commands; cmd; cmd = cmd->next) {
1075 if (cmd->error_string)
1076 continue;
1078 if (cmd->skip_update)
1079 continue;
1081 cmd->error_string = update(cmd, si);
1082 if (shallow_update && !cmd->error_string &&
1083 si->shallow_ref[cmd->index]) {
1084 error("BUG: connectivity check has not been run on ref %s",
1085 cmd->ref_name);
1086 checked_connectivity = 0;
1090 if (shallow_update && !checked_connectivity)
1091 error("BUG: run 'git fsck' for safety.\n"
1092 "If there are errors, try to remove "
1093 "the reported refs above");
1096 static struct command **queue_command(struct command **tail,
1097 const char *line,
1098 int linelen)
1100 unsigned char old_sha1[20], new_sha1[20];
1101 struct command *cmd;
1102 const char *refname;
1103 int reflen;
1105 if (linelen < 83 ||
1106 line[40] != ' ' ||
1107 line[81] != ' ' ||
1108 get_sha1_hex(line, old_sha1) ||
1109 get_sha1_hex(line + 41, new_sha1))
1110 die("protocol error: expected old/new/ref, got '%s'", line);
1112 refname = line + 82;
1113 reflen = linelen - 82;
1114 cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
1115 hashcpy(cmd->old_sha1, old_sha1);
1116 hashcpy(cmd->new_sha1, new_sha1);
1117 memcpy(cmd->ref_name, refname, reflen);
1118 cmd->ref_name[reflen] = '\0';
1119 *tail = cmd;
1120 return &cmd->next;
1123 static void queue_commands_from_cert(struct command **tail,
1124 struct strbuf *push_cert)
1126 const char *boc, *eoc;
1128 if (*tail)
1129 die("protocol error: got both push certificate and unsigned commands");
1131 boc = strstr(push_cert->buf, "\n\n");
1132 if (!boc)
1133 die("malformed push certificate %.*s", 100, push_cert->buf);
1134 else
1135 boc += 2;
1136 eoc = push_cert->buf + parse_signature(push_cert->buf, push_cert->len);
1138 while (boc < eoc) {
1139 const char *eol = memchr(boc, '\n', eoc - boc);
1140 tail = queue_command(tail, boc, eol ? eol - boc : eoc - eol);
1141 boc = eol ? eol + 1 : eoc;
1145 static struct command *read_head_info(struct sha1_array *shallow)
1147 struct command *commands = NULL;
1148 struct command **p = &commands;
1149 for (;;) {
1150 char *line;
1151 int len, linelen;
1153 line = packet_read_line(0, &len);
1154 if (!line)
1155 break;
1157 if (len == 48 && starts_with(line, "shallow ")) {
1158 unsigned char sha1[20];
1159 if (get_sha1_hex(line + 8, sha1))
1160 die("protocol error: expected shallow sha, got '%s'",
1161 line + 8);
1162 sha1_array_append(shallow, sha1);
1163 continue;
1166 linelen = strlen(line);
1167 if (linelen < len) {
1168 const char *feature_list = line + linelen + 1;
1169 if (parse_feature_request(feature_list, "report-status"))
1170 report_status = 1;
1171 if (parse_feature_request(feature_list, "side-band-64k"))
1172 use_sideband = LARGE_PACKET_MAX;
1173 if (parse_feature_request(feature_list, "quiet"))
1174 quiet = 1;
1177 if (!strcmp(line, "push-cert")) {
1178 int true_flush = 0;
1179 char certbuf[1024];
1181 for (;;) {
1182 len = packet_read(0, NULL, NULL,
1183 certbuf, sizeof(certbuf), 0);
1184 if (!len) {
1185 true_flush = 1;
1186 break;
1188 if (!strcmp(certbuf, "push-cert-end\n"))
1189 break; /* end of cert */
1190 strbuf_addstr(&push_cert, certbuf);
1193 if (true_flush)
1194 break;
1195 continue;
1198 p = queue_command(p, line, linelen);
1201 if (push_cert.len)
1202 queue_commands_from_cert(p, &push_cert);
1204 return commands;
1207 static const char *parse_pack_header(struct pack_header *hdr)
1209 switch (read_pack_header(0, hdr)) {
1210 case PH_ERROR_EOF:
1211 return "eof before pack header was fully read";
1213 case PH_ERROR_PACK_SIGNATURE:
1214 return "protocol error (pack signature mismatch detected)";
1216 case PH_ERROR_PROTOCOL:
1217 return "protocol error (pack version unsupported)";
1219 default:
1220 return "unknown error in parse_pack_header";
1222 case 0:
1223 return NULL;
1227 static const char *pack_lockfile;
1229 static const char *unpack(int err_fd, struct shallow_info *si)
1231 struct pack_header hdr;
1232 struct argv_array av = ARGV_ARRAY_INIT;
1233 const char *hdr_err;
1234 int status;
1235 char hdr_arg[38];
1236 struct child_process child = CHILD_PROCESS_INIT;
1237 int fsck_objects = (receive_fsck_objects >= 0
1238 ? receive_fsck_objects
1239 : transfer_fsck_objects >= 0
1240 ? transfer_fsck_objects
1241 : 0);
1243 hdr_err = parse_pack_header(&hdr);
1244 if (hdr_err) {
1245 if (err_fd > 0)
1246 close(err_fd);
1247 return hdr_err;
1249 snprintf(hdr_arg, sizeof(hdr_arg),
1250 "--pack_header=%"PRIu32",%"PRIu32,
1251 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
1253 if (si->nr_ours || si->nr_theirs) {
1254 alt_shallow_file = setup_temporary_shallow(si->shallow);
1255 argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
1258 if (ntohl(hdr.hdr_entries) < unpack_limit) {
1259 argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
1260 if (quiet)
1261 argv_array_push(&av, "-q");
1262 if (fsck_objects)
1263 argv_array_push(&av, "--strict");
1264 child.argv = av.argv;
1265 child.no_stdout = 1;
1266 child.err = err_fd;
1267 child.git_cmd = 1;
1268 status = run_command(&child);
1269 if (status)
1270 return "unpack-objects abnormal exit";
1271 } else {
1272 int s;
1273 char keep_arg[256];
1275 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
1276 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
1277 strcpy(keep_arg + s, "localhost");
1279 argv_array_pushl(&av, "index-pack",
1280 "--stdin", hdr_arg, keep_arg, NULL);
1281 if (fsck_objects)
1282 argv_array_push(&av, "--strict");
1283 if (fix_thin)
1284 argv_array_push(&av, "--fix-thin");
1285 child.argv = av.argv;
1286 child.out = -1;
1287 child.err = err_fd;
1288 child.git_cmd = 1;
1289 status = start_command(&child);
1290 if (status)
1291 return "index-pack fork failed";
1292 pack_lockfile = index_pack_lockfile(child.out);
1293 close(child.out);
1294 status = finish_command(&child);
1295 if (status)
1296 return "index-pack abnormal exit";
1297 reprepare_packed_git();
1299 return NULL;
1302 static const char *unpack_with_sideband(struct shallow_info *si)
1304 struct async muxer;
1305 const char *ret;
1307 if (!use_sideband)
1308 return unpack(0, si);
1310 memset(&muxer, 0, sizeof(muxer));
1311 muxer.proc = copy_to_sideband;
1312 muxer.in = -1;
1313 if (start_async(&muxer))
1314 return NULL;
1316 ret = unpack(muxer.in, si);
1318 finish_async(&muxer);
1319 return ret;
1322 static void prepare_shallow_update(struct command *commands,
1323 struct shallow_info *si)
1325 int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1327 si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1328 si->shallow->nr);
1329 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1331 si->need_reachability_test =
1332 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1333 si->reachable =
1334 xcalloc(si->shallow->nr, sizeof(*si->reachable));
1335 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1337 for (i = 0; i < si->nr_ours; i++)
1338 si->need_reachability_test[si->ours[i]] = 1;
1340 for (i = 0; i < si->shallow->nr; i++) {
1341 if (!si->used_shallow[i])
1342 continue;
1343 for (j = 0; j < bitmap_size; j++) {
1344 if (!si->used_shallow[i][j])
1345 continue;
1346 si->need_reachability_test[i]++;
1347 for (k = 0; k < 32; k++)
1348 if (si->used_shallow[i][j] & (1 << k))
1349 si->shallow_ref[j * 32 + k]++;
1353 * true for those associated with some refs and belong
1354 * in "ours" list aka "step 7 not done yet"
1356 si->need_reachability_test[i] =
1357 si->need_reachability_test[i] > 1;
1361 * keep hooks happy by forcing a temporary shallow file via
1362 * env variable because we can't add --shallow-file to every
1363 * command. check_everything_connected() will be done with
1364 * true .git/shallow though.
1366 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1369 static void update_shallow_info(struct command *commands,
1370 struct shallow_info *si,
1371 struct sha1_array *ref)
1373 struct command *cmd;
1374 int *ref_status;
1375 remove_nonexistent_theirs_shallow(si);
1376 if (!si->nr_ours && !si->nr_theirs) {
1377 shallow_update = 0;
1378 return;
1381 for (cmd = commands; cmd; cmd = cmd->next) {
1382 if (is_null_sha1(cmd->new_sha1))
1383 continue;
1384 sha1_array_append(ref, cmd->new_sha1);
1385 cmd->index = ref->nr - 1;
1387 si->ref = ref;
1389 if (shallow_update) {
1390 prepare_shallow_update(commands, si);
1391 return;
1394 ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1395 assign_shallow_commits_to_refs(si, NULL, ref_status);
1396 for (cmd = commands; cmd; cmd = cmd->next) {
1397 if (is_null_sha1(cmd->new_sha1))
1398 continue;
1399 if (ref_status[cmd->index]) {
1400 cmd->error_string = "shallow update not allowed";
1401 cmd->skip_update = 1;
1404 free(ref_status);
1407 static void report(struct command *commands, const char *unpack_status)
1409 struct command *cmd;
1410 struct strbuf buf = STRBUF_INIT;
1412 packet_buf_write(&buf, "unpack %s\n",
1413 unpack_status ? unpack_status : "ok");
1414 for (cmd = commands; cmd; cmd = cmd->next) {
1415 if (!cmd->error_string)
1416 packet_buf_write(&buf, "ok %s\n",
1417 cmd->ref_name);
1418 else
1419 packet_buf_write(&buf, "ng %s %s\n",
1420 cmd->ref_name, cmd->error_string);
1422 packet_buf_flush(&buf);
1424 if (use_sideband)
1425 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1426 else
1427 write_or_die(1, buf.buf, buf.len);
1428 strbuf_release(&buf);
1431 static int delete_only(struct command *commands)
1433 struct command *cmd;
1434 for (cmd = commands; cmd; cmd = cmd->next) {
1435 if (!is_null_sha1(cmd->new_sha1))
1436 return 0;
1438 return 1;
1441 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
1443 int advertise_refs = 0;
1444 int i;
1445 struct command *commands;
1446 struct sha1_array shallow = SHA1_ARRAY_INIT;
1447 struct sha1_array ref = SHA1_ARRAY_INIT;
1448 struct shallow_info si;
1450 packet_trace_identity("receive-pack");
1452 argv++;
1453 for (i = 1; i < argc; i++) {
1454 const char *arg = *argv++;
1456 if (*arg == '-') {
1457 if (!strcmp(arg, "--quiet")) {
1458 quiet = 1;
1459 continue;
1462 if (!strcmp(arg, "--advertise-refs")) {
1463 advertise_refs = 1;
1464 continue;
1466 if (!strcmp(arg, "--stateless-rpc")) {
1467 stateless_rpc = 1;
1468 continue;
1470 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1471 fix_thin = 0;
1472 continue;
1475 usage(receive_pack_usage);
1477 if (service_dir)
1478 usage(receive_pack_usage);
1479 service_dir = arg;
1481 if (!service_dir)
1482 usage(receive_pack_usage);
1484 setup_path();
1486 if (!enter_repo(service_dir, 0))
1487 die("'%s' does not appear to be a git repository", service_dir);
1489 git_config(receive_pack_config, NULL);
1490 if (cert_nonce_seed)
1491 push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
1493 if (0 <= transfer_unpack_limit)
1494 unpack_limit = transfer_unpack_limit;
1495 else if (0 <= receive_unpack_limit)
1496 unpack_limit = receive_unpack_limit;
1498 if (advertise_refs || !stateless_rpc) {
1499 write_head_info();
1501 if (advertise_refs)
1502 return 0;
1504 if ((commands = read_head_info(&shallow)) != NULL) {
1505 const char *unpack_status = NULL;
1507 prepare_shallow_info(&si, &shallow);
1508 if (!si.nr_ours && !si.nr_theirs)
1509 shallow_update = 0;
1510 if (!delete_only(commands)) {
1511 unpack_status = unpack_with_sideband(&si);
1512 update_shallow_info(commands, &si, &ref);
1514 execute_commands(commands, unpack_status, &si);
1515 if (pack_lockfile)
1516 unlink_or_warn(pack_lockfile);
1517 if (report_status)
1518 report(commands, unpack_status);
1519 run_receive_hook(commands, "post-receive", 1);
1520 run_update_post_hook(commands);
1521 if (auto_gc) {
1522 const char *argv_gc_auto[] = {
1523 "gc", "--auto", "--quiet", NULL,
1525 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1526 run_command_v_opt(argv_gc_auto, opt);
1528 if (auto_update_server_info)
1529 update_server_info(0);
1530 clear_shallow_info(&si);
1532 if (use_sideband)
1533 packet_flush(1);
1534 sha1_array_clear(&shallow);
1535 sha1_array_clear(&ref);
1536 free((void *)push_cert_nonce);
1537 return 0;