Пример #1
0
static CK_RV
finish_iterating (P11KitIter *iter,
                  CK_RV rv)
{
	finish_object (iter);
	finish_slot (iter);
	finish_module (iter);
	p11_array_clear (iter->modules);

	iter->iterating = 0;
	return rv;
}
Пример #2
0
static CK_RV
move_next_session (P11KitIter *iter)
{
	CK_ULONG session_flags;
	CK_ULONG num_slots;
	CK_INFO minfo;
	CK_RV rv;

	finish_slot (iter);

	/* If we have no more slots, then move to next module */
	while (iter->saw_slots >= iter->num_slots) {
		finish_module (iter);

		/* Iter is finished */
		if (iter->modules->num == 0)
			return finish_iterating (iter, CKR_CANCEL);

		iter->module = iter->modules->elem[0];
		p11_array_remove (iter->modules, 0);

		/* Skip module if it doesn't match uri */
		assert (iter->module != NULL);
		rv = (iter->module->C_GetInfo) (&minfo);
		if (rv != CKR_OK || !p11_match_uri_module_info (&iter->match_module, &minfo))
			continue;

		rv = (iter->module->C_GetSlotList) (CK_TRUE, NULL, &num_slots);
		if (rv != CKR_OK)
			return finish_iterating (iter, rv);

		iter->slots = realloc (iter->slots, sizeof (CK_SLOT_ID) * (num_slots + 1));
		return_val_if_fail (iter->slots != NULL, CKR_HOST_MEMORY);

		rv = (iter->module->C_GetSlotList) (CK_TRUE, iter->slots, &num_slots);
		if (rv != CKR_OK)
			return finish_iterating (iter, rv);

		iter->num_slots = num_slots;
		assert (iter->saw_slots == 0);
	}

	/* Move to the next slot, and open a session on it */
	while (iter->saw_slots < iter->num_slots) {
		iter->slot = iter->slots[iter->saw_slots++];

		assert (iter->module != NULL);
		if (iter->match_slot_id != (CK_SLOT_ID)-1 && iter->slot != iter->match_slot_id)
			continue;
		rv = (iter->module->C_GetSlotInfo) (iter->slot, &iter->slot_info);
		if (rv != CKR_OK || !p11_match_uri_slot_info (&iter->match_slot, &iter->slot_info))
			continue;
		rv = (iter->module->C_GetTokenInfo) (iter->slot, &iter->token_info);
		if (rv != CKR_OK || !p11_match_uri_token_info (&iter->match_token, &iter->token_info))
			continue;

		session_flags = CKF_SERIAL_SESSION;

		/* Skip if the read/write on a read-only token */
		if (iter->want_writable && (iter->token_info.flags & CKF_WRITE_PROTECTED) == 0)
			session_flags |= CKF_RW_SESSION;

		rv = (iter->module->C_OpenSession) (iter->slot, session_flags,
		                                    NULL, NULL, &iter->session);
		if (rv != CKR_OK)
			return finish_iterating (iter, rv);

		if (iter->session != 0)
			return CKR_OK;
	}

	/* Otherwise try again */
	return move_next_session (iter);
}
Пример #3
0
static void before_module_multi(WasmModule* module, void* user_data) {
  Context* ctx = user_data;
  finish_module(ctx);
  before_module(module, user_data);
}
Пример #4
0
int wasm_gen_file(WasmSource* source,
                  int multi_module,
                  WasmParserTypeCheck type_check) {
  Context ctx = {};
  WasmParserCallbacks callbacks = {};
  callbacks.user_data = &ctx;
  callbacks.error = error;
  callbacks.before_module = before_module;
  callbacks.after_module = after_module;
  callbacks.before_function = before_function;
  callbacks.after_function = after_function;
  callbacks.before_block = before_block;
  callbacks.after_block = after_block;
  callbacks.before_binary = before_binary;
  callbacks.before_break = before_break;
  callbacks.after_break = after_break;
  callbacks.before_call = before_call;
  callbacks.before_call_import = before_call_import;
  callbacks.before_compare = before_compare;
  callbacks.after_const = after_const;
  callbacks.before_convert = before_convert;
  callbacks.after_get_local = after_get_local;
  callbacks.before_if = before_if;
  callbacks.after_if = after_if;
  callbacks.before_label = before_label;
  callbacks.after_label = after_label;
  callbacks.before_load = before_load;
  callbacks.after_load_global = after_load_global;
  callbacks.before_loop = before_loop;
  callbacks.after_loop = after_loop;
  callbacks.after_memory_size = after_memory_size;
  callbacks.after_nop = after_nop;
  callbacks.after_page_size = after_page_size;
  callbacks.before_resize_memory = before_resize_memory;
  callbacks.before_return = before_return;
  callbacks.before_set_local = before_set_local;
  callbacks.before_store = before_store;
  callbacks.before_store_global = before_store_global;
  callbacks.before_unary = before_unary;
  callbacks.assert_invalid_error = assert_invalid_error;

  int result;
  if (multi_module) {
    if (g_outfile) {
      callbacks.before_module = before_module_multi;
      callbacks.after_module = after_module_multi;
      callbacks.before_assert_return = before_assert_return;
      callbacks.after_assert_return = after_assert_return;
      callbacks.before_assert_return_nan = before_assert_return_nan;
      callbacks.after_assert_return_nan = after_assert_return_nan;
      callbacks.before_assert_trap = before_assert_trap;
      callbacks.after_assert_trap = after_assert_trap;
      callbacks.before_invoke = before_invoke;
      callbacks.after_invoke = after_invoke;
      init_output_buffer(&ctx.js_buf, INITIAL_OUTPUT_BUFFER_CAPACITY);
    }
    result =
        wasm_parse_file(source, &callbacks, type_check);
    if (g_outfile) {
      finish_module(&ctx);
      write_output_buffer(&ctx.js_buf, g_outfile);
    }
  } else {
    result =
        wasm_parse_module(source, &callbacks, type_check);
    if (result == 0 && g_outfile)
      write_output_buffer(&ctx.buf, g_outfile);
  }

  destroy_context(&ctx);
  return result;
}