static bool process_hunk(char const *program, struct notify_info *notify, struct memory_block_data const *payload, struct memory_block_signature const *signature) { struct signature_algorithm *sigalg = NULL; struct decompression_algorithm *decompalg = NULL; sigalg = create_sigalg(signature); if (!sigalg) goto err; decompalg = create_decompress(payload); if (!decompalg && payload->compression != STREAM_COMPRESS_NONE) goto err; if (!send_stream(program, notify, payload, sigalg, decompalg)) goto err; if (!signature_update(sigalg, payload->mem.stream->extra_salt, payload->mem.stream->extra_salt_len) || !signature_update(sigalg, signature->shdr->salt, sizeof signature->shdr->salt) || !signature_update(sigalg, signature->hhdr, sizeof *signature->hhdr)) goto err; if (signature->mem.len && !verify_signature(signature, sigalg)) goto err; if (!finish_stream(program, payload, sigalg)) goto err; signature_free(sigalg); return true; err: decompression_free(decompalg); signature_free(sigalg); return false; }
json_t *json_bencode_loadf(FILE *input, size_t flags, json_error_t *error) { stream_t stream; const char *source; json_t *result; if(input == stdin) source = "<stdin>"; else source = "<stream>"; jsonp_error_init(error, source); if (input == NULL) { error_set(error, NULL, "wrong arguments"); return NULL; } init_stream(&stream, NULL, 0, file_fill, input); result = parse_bencode(&stream, flags, error); finish_stream(&stream); return result; }