Ejemplo n.º 1
0
const std::string hotkey_base::get_name() const
{
	std::string ret = "";

	if (mod_ & KMOD_CTRL)
		ret += "ctrl";

	ret +=
			(!ret.empty() && !boost::algorithm::ends_with(ret, "+") ?
					"+" : "");
	if (mod_ & KMOD_ALT)
		ret += "alt";

	ret +=
			(!ret.empty() && !boost::algorithm::ends_with(ret, "+") ?
					"+" : "");
	if (mod_ & KMOD_SHIFT)
		ret += "shift";

	ret +=
			(!ret.empty() && !boost::algorithm::ends_with(ret, "+") ?
					"+" : "");
	if (mod_ & KMOD_GUI)
#ifdef __APPLE__
		ret += "cmd";
#else
		ret += "win";
#endif

	ret +=
			(!ret.empty() && !boost::algorithm::ends_with(ret, "+") ?
					"+" : "");
	return ret += get_name_helper();
}
Ejemplo n.º 2
0
// data: Where we are in the dns payload
// payload: the entire udp payload
static char* get_name(const char* data, uint16_t data_len, const char* payload, 
		uint16_t payload_len, uint16_t* bytes_consumed)
{
	log_trace("dns", "call to get_name, data_len: %d", data_len);

	char* name = xmalloc(MAX_NAME_LENGTH);
	
	*bytes_consumed = get_name_helper(data, data_len, payload, 
			payload_len, name, MAX_NAME_LENGTH - 1, 0);

	if (*bytes_consumed == 0) {
		free(name);
		return NULL;
	}

	// Our memset ensured null byte.
	assert(name[MAX_NAME_LENGTH - 1] == '\0');			   

	log_trace("dns", "return success from get_name, bytes_consumed: %d, string: %s", 
			*bytes_consumed, name);

	return name;

}
Ejemplo n.º 3
0
static uint16_t get_name_helper(const char* data, uint16_t data_len, 
		const char* payload, uint16_t payload_len, char* name, 
		uint16_t name_len, uint16_t recursion_level)
{
	log_trace("dns", "_get_name_helper IN, datalen: %d namelen: %d recusion: %d", 
			data_len, name_len, recursion_level);

	if (data_len == 0 || name_len == 0 || payload_len == 0) {
		log_trace("dns", "_get_name_helper OUT, err. 0 length field. datalen %d namelen %d payloadlen %d", 
				data_len, name_len, payload_len);
		return 0;
	}

	if (recursion_level > MAX_LABEL_RECURSION) {
		log_trace("dns", "_get_name_helper OUT. ERR, MAX RECUSION");
		return 0;
	}

	uint16_t bytes_consumed = 0;

	// The start of data is either a sequence of labels or a ptr.
	while(data_len > 0) { 

		uint8_t byte = data[0];
   
		// Is this a pointer?
		if (byte >= 0xc0) {
		 
			log_trace("dns", "_get_name_helper, ptr encountered");
		  
			// Do we have enough bytes to check ahead?
			if (data_len < 2) {
				log_trace("dns", "_get_name_helper OUT. ptr byte encountered. No offset. ERR.");
				return 0;
			}

			// No. ntohs isn't needed here. It's because of
			// the upper 2 bits indicating a pointer.
			uint16_t offset = ((byte & 0x03) << 8) | (uint8_t)data[1];

			log_trace("dns", "_get_name_helper. ptr offset 0x%x", offset);

			if (offset >= payload_len) { 
				log_trace("dns", "_get_name_helper OUT. offset exceeded payload len %d ERR", 
						payload_len);
				return 0;
			}

			// We need to add a dot if we are:
			// -- Not first level recursion.
			// -- have consumed bytes
			if (recursion_level > 0 || bytes_consumed > 0) {

				if (name_len < 1) {
					log_warn("dns", "Exceeded static name field allocation.");
					return 0;
				}
			
				name[0] = '.';
				name++;
				name_len--;
			}

			uint16_t rec_bytes_consumed = get_name_helper(payload + offset, 
					payload_len - offset, payload, payload_len, name, name_len, 
					recursion_level + 1);

			// We are done so don't bother to increment the pointers.
			if (rec_bytes_consumed == 0) {
				log_trace("dns", "_get_name_helper OUT. rec level %d failed", 
						recursion_level);
				return 0;
			} else {
				bytes_consumed += 2;
				log_trace("dns", "_get_name_helper OUT. rec level %d success. %d rec bytes consumed. %d bytes consumed.", 
						recursion_level, rec_bytes_consumed, bytes_consumed);
				return bytes_consumed;
			}

		} else if (byte == '\0') {

			// don't bother with pointer incrementation. We're done.
			bytes_consumed += 1;
			log_trace("dns", "_get_name_helper OUT. rec level %d success. %d bytes consumed.", 
					recursion_level, bytes_consumed);
			return bytes_consumed; 
		
		} else {

			log_trace("dns", "_get_name_helper, segment 0x%hx encountered", 
					byte);

			// We've now consumed a byte.
			++data;
			--data_len;
			// Mark byte consumed after we check for first iteration.

			// Do we have enough data left (must have null byte too)?
			if ((byte+1) > data_len) {
				log_trace("dns", "_get_name_helper OUT. ERR. Not enough data for segment %hd"); 
				return 0;
			}	

			// If we've consumed any bytes and are in a label, we're in a 
			// label chain. We need to add a dot.
			if (bytes_consumed > 0) { 

				if (name_len < 1) {
					log_warn("dns", "Exceeded static name field allocation.");
					return 0;
				}
			
				name[0] = '.';
				name++;
				name_len--;
			}

			// Now we've consumed a byte.
			++bytes_consumed;

			// Did we run out of our arbitrary buffer?
			if (byte > name_len) {
				log_warn("dns", "Exceeded static name field allocation.");
				return 0;
			}

			assert(data_len > 0);

			memcpy(name, data, byte);
	
			name += byte;
			name_len -= byte;
	
			data_len -= byte;
			data += byte;
			bytes_consumed += byte;
 
			// Handled in the byte+1 check above.
			assert(data_len > 0);
		}
	}

	// We should never get here.
	// For each byte we either have:
	// -- a ptr, which terminates
	// -- a null byte, which terminates
	// -- a segment length which either terminates or ensures we keep looping

	assert(0);
	return 0;
}