Пример #1
0
int
packet_encode_rr(query_type *q, domain_type *owner, rr_type *rr)
{
	size_t truncation_mark;
	uint16_t rdlength = 0;
	size_t rdlength_pos;
	uint16_t j;

	assert(q);
	assert(owner);
	assert(rr);

	/*
	 * If the record does not in fit in the packet the packet size
	 * will be restored to the mark.
	 */
	truncation_mark = buffer_position(q->packet);

	encode_dname(q, owner);
	buffer_write_u16(q->packet, rr->type);
	buffer_write_u16(q->packet, rr->klass);
	buffer_write_u32(q->packet, rr->ttl);

	/* Reserve space for rdlength. */
	rdlength_pos = buffer_position(q->packet);
	buffer_skip(q->packet, sizeof(rdlength));

	for (j = 0; j < rr->rdata_count; ++j) {
		switch (rdata_atom_wireformat_type(rr->type, j)) {
		case RDATA_WF_COMPRESSED_DNAME:
			encode_dname(q, rdata_atom_domain(rr->rdatas[j]));
			break;
		case RDATA_WF_UNCOMPRESSED_DNAME:
		{
			const dname_type *dname = domain_dname(
				rdata_atom_domain(rr->rdatas[j]));
			buffer_write(q->packet,
				     dname_name(dname), dname->name_size);
			break;
		}
		default:
			buffer_write(q->packet,
				     rdata_atom_data(rr->rdatas[j]),
				     rdata_atom_size(rr->rdatas[j]));
			break;
		}
	}

	if (!query_overflow(q)) {
		rdlength = (buffer_position(q->packet) - rdlength_pos
			    - sizeof(rdlength));
		buffer_write_u16_at(q->packet, rdlength_pos, rdlength);
		return 1;
	} else {
		buffer_set_position(q->packet, truncation_mark);
		query_clear_dname_offsets(q, truncation_mark);
		assert(!query_overflow(q));
		return 0;
	}
}
Пример #2
0
void sc_action_process(struct sc_action *sa) {
	sc_action_debug_print(sa);

	int haskey = 1;

	BUFFER *buffer = buffer_new();

	buffer_write_u8(buffer,(uint8_t)sa->m_shellcode->nspace);
	switch (sa->m_shellcode->nspace) {
	case sc_bindfiletransfer:
	case sc_bindshell:
		buffer_write_u8(buffer, sc_port);
		buffer_write_u16(buffer,htons((uint16_t)sa->m_action.m_bind.m_localport));

		if ( haskey ) {
			buffer_write_u8(buffer,sc_key);
			buffer_write_u32(buffer,htonl((uint32_t)sa->m_action.m_bind.m_key));
		}
		break;

	case sc_connectbackfiletransfer:
	case sc_connectbackshell:
		buffer_write_u8(buffer,sc_host);
		buffer_write_u32(buffer,htonl((uint16_t)sa->m_action.m_connectback.m_remotehost));
		buffer_write_u8(buffer,sc_port);
		buffer_write_u16(buffer,htons((uint16_t)sa->m_action.m_connectback.m_remoteport));
		if ( haskey )
		{
			buffer_write_u8(buffer,sc_key);
			buffer_write_u32(buffer,htonl((uint32_t)sa->m_action.m_connectback.m_key));
		}
		connectback(sa, haskey);
		break;

	case sc_execute:
		buffer_write_u8(buffer,sc_command);
		buffer_write_u8(buffer,strlen(sa->m_action.m_execute.m_command));
		buffer_write_string(buffer,sa->m_action.m_execute.m_command);
		break;

	case sc_url:
		buffer_write_u8(buffer,sc_uri);
		buffer_write_u8(buffer,strlen(sa->m_action.m_url.m_link));
		buffer_write_string(buffer,sa->m_action.m_url.m_link);
		break;

	default:
		break;
	}

//	int size = buffer_write_size_get(buffer);

	// send here

	buffer_free(buffer);

	return;
}
Пример #3
0
/**
 * Add RR to query.
 *
 */
int
query_add_rr(query_type* q, ldns_rr* rr)
{
    size_t i = 0;
    size_t tc_mark = 0;
    size_t rdlength_pos = 0;
    uint16_t rdlength = 0;

    ods_log_assert(q);
    ods_log_assert(q->buffer);
    ods_log_assert(rr);

    /* set truncation mark, in case rr does not fit */
    tc_mark = buffer_position(q->buffer);
    /* owner type class ttl */
    if (!buffer_available(q->buffer, ldns_rdf_size(ldns_rr_owner(rr)))) {
        goto query_add_rr_tc;
    }
    buffer_write_rdf(q->buffer, ldns_rr_owner(rr));
    if (!buffer_available(q->buffer, sizeof(uint16_t) + sizeof(uint16_t) +
        sizeof(uint32_t) + sizeof(rdlength))) {
        goto query_add_rr_tc;
    }
    buffer_write_u16(q->buffer, (uint16_t) ldns_rr_get_type(rr));
    buffer_write_u16(q->buffer, (uint16_t) ldns_rr_get_class(rr));
    buffer_write_u32(q->buffer, (uint32_t) ldns_rr_ttl(rr));
    /* skip rdlength */
    rdlength_pos = buffer_position(q->buffer);
    buffer_skip(q->buffer, sizeof(rdlength));
    /* write rdata */
    for (i=0; i < ldns_rr_rd_count(rr); i++) {
        if (!buffer_available(q->buffer, ldns_rdf_size(ldns_rr_rdf(rr, i)))) {
            goto query_add_rr_tc;
        }
        buffer_write_rdf(q->buffer, ldns_rr_rdf(rr, i));
    }

    if (!query_overflow(q)) {
        /* write rdlength */
        rdlength = buffer_position(q->buffer) - rdlength_pos - sizeof(rdlength);
        buffer_write_u16_at(q->buffer, rdlength_pos, rdlength);
        /* position updated by buffer_write() */
        return 1;
    }

query_add_rr_tc:
    buffer_set_position(q->buffer, tc_mark);
    ods_log_assert(!query_overflow(q));
    return 0;

}
Пример #4
0
int bvlc_read_fdt_ack_encode(bvlc_read_fdt_ack_t *message, buffer_t *buf)
{
  int ret = 1
    && buffer_write_u16(buf, 0);

  if(ret) {
    for(uint16_t i = 0; ret && i < message->entry_count; i++) {
      ret = 1
        && buffer_write_raw(buf, message->entries[i].bip_address, 6)
        && buffer_write_u16(buf, message->entries[i].original_ttl)
        && buffer_write_u16(buf, message->entries[i].ttl);
    }
  }

  return ret;
}
Пример #5
0
int bvlc_forwarded_npdu_encode(bvlc_forwarded_npdu_t *message, buffer_t *buf)
{
  return 1
    && buffer_write_u16(buf, 0)
    && buffer_write_raw(buf, message->original_bip_address, 6)
    && buffer_write_raw(buf, message->npdu, message->npdu_length);
}
Пример #6
0
static void
encode_dname(query_type *q, domain_type *domain)
{
	while (domain->parent && query_get_dname_offset(q, domain) == 0) {
		query_put_dname_offset(q, domain, buffer_position(q->packet));
		DEBUG(DEBUG_NAME_COMPRESSION, 2,
		      (LOG_INFO, "dname: %s, number: %lu, offset: %u\n",
		       dname_to_string(domain_dname(domain), NULL),
		       (unsigned long) domain->number,
		       query_get_dname_offset(q, domain)));
		buffer_write(q->packet, dname_name(domain_dname(domain)),
			     label_length(dname_name(domain_dname(domain))) + 1U);
		domain = domain->parent;
	}
	if (domain->parent) {
		DEBUG(DEBUG_NAME_COMPRESSION, 2,
		      (LOG_INFO, "dname: %s, number: %lu, pointer: %u\n",
		       dname_to_string(domain_dname(domain), NULL),
		       (unsigned long) domain->number,
		       query_get_dname_offset(q, domain)));
		assert(query_get_dname_offset(q, domain) <= MAX_COMPRESSION_OFFSET);
		buffer_write_u16(q->packet,
				 0xc000 | query_get_dname_offset(q, domain));
	} else {
		buffer_write_u8(q->packet, 0);
	}
}
Пример #7
0
void
xfrd_setup_packet(buffer_type* packet,
	uint16_t type, uint16_t klass, const dname_type* dname)
{
	/* Set up the header */
	buffer_clear(packet);
	ID_SET(packet, qid_generate());
	FLAGS_SET(packet, 0);
	OPCODE_SET(packet, OPCODE_QUERY);
	QDCOUNT_SET(packet, 1);
	ANCOUNT_SET(packet, 0);
	NSCOUNT_SET(packet, 0);
	ARCOUNT_SET(packet, 0);
	buffer_skip(packet, QHEADERSZ);

	/* The question record. */
	buffer_write(packet, dname_name(dname), dname->name_size);
	buffer_write_u16(packet, type);
	buffer_write_u16(packet, klass);
}
Пример #8
0
int bvlc_write_bdt_encode(bvlc_write_bdt_t *message, buffer_t *buf)
{
  int ret = 1
    && buffer_write_u16(buf, 0);

  if(ret) {
    for(uint16_t i = 0; ret && i < message->entry_count; i++) {
      ret = 1
        && buffer_write_raw(buf, message->entries[i].bip_address, 6)
        && buffer_write_raw(buf, message->entries[i].broadcast_mask, 4);
    }
  }

  return ret;
}
Пример #9
0
int bvlc_original_broadcast_encode(bvlc_original_broadcast_t *message, buffer_t *buf)
{
  return 1
    && buffer_write_u16(buf, 0)
    && buffer_write_raw(buf, message->npdu, message->npdu_length);
}
Пример #10
0
int bvlc_delete_fdt_entry_encode(bvlc_delete_fdt_entry_t *message, buffer_t *buf)
{
  return 1
    && buffer_write_u16(buf, 0)
    && buffer_write_raw(buf, message->bip_address, 6);
}
Пример #11
0
int bvlc_read_fdt_encode(bvlc_read_fdt_t *message, buffer_t *buf)
{
  return 1
    && buffer_write_u16(buf, 0);
}
Пример #12
0
int bvlc_register_fd_encode(bvlc_register_fd_t *message, buffer_t *buf)
{
  return 1
    && buffer_write_u16(buf, 0)
    && buffer_write_u16(buf, message->ttl);
}
Пример #13
0
int bvlc_result_encode(bvlc_result_t *message, buffer_t *buf)
{
  return 1
    && buffer_write_u16(buf, 0)
    && buffer_write_u16(buf, message->result_code);
}
Пример #14
0
static void
marshal_u16(struct buffer* b, uint16_t v)
{
	buffer_reserve(b, 2);
	buffer_write_u16(b, v);
}