Exemple #1
0
static void dump_int(char *output, int maxlen, void *value, int len)
{
	if (len == (int)sizeof(unsigned int))
		snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_unaligned_uint32(value)));
	else
		ast_copy_string(output, "Invalid INT", maxlen);	
}
Exemple #2
0
static void dump_datetime(char *output, int maxlen, void *value, int len)
{
	struct ast_tm tm;
	unsigned long val = (unsigned long) ntohl(get_unaligned_uint32(value));
	if (len == (int)sizeof(unsigned int)) {
		tm.tm_sec  = (val & 0x1f) << 1;
		tm.tm_min  = (val >> 5) & 0x3f;
		tm.tm_hour = (val >> 11) & 0x1f;
		tm.tm_mday = (val >> 16) & 0x1f;
		tm.tm_mon  = ((val >> 21) & 0x0f) - 1;
		tm.tm_year = ((val >> 25) & 0x7f) + 100;
		ast_strftime(output, maxlen, "%Y-%m-%d  %T", &tm); 
	} else
Exemple #3
0
/*!
 * \internal
 * \brief Check the fences of a region.
 *
 * \param reg Region block to check.
 *
 * \return Nothing
 */
static void region_check_fences(struct ast_region *reg)
{
	unsigned int *fence;

	/*
	 * We use the bytes just preceeding reg->data and not reg->fence
	 * because there is likely to be padding between reg->fence and
	 * reg->data for reg->data alignment.
	 */
	fence = (unsigned int *) (reg->data - sizeof(*fence));
	if (*fence != FENCE_MAGIC) {
		astmm_log("WARNING: Low fence violation of %p allocated at %s %s() line %d\n",
			reg->data, reg->file, reg->func, reg->lineno);
		print_backtrace(reg->bt);
		my_do_crash();
	}
	fence = (unsigned int *) (reg->data + reg->len);
	if (get_unaligned_uint32(fence) != FENCE_MAGIC) {
		astmm_log("WARNING: High fence violation of %p allocated at %s %s() line %d\n",
			reg->data, reg->file, reg->func, reg->lineno);
		print_backtrace(reg->bt);
		my_do_crash();
	}
}
Exemple #4
0
static int parse_iax2_ies(struct iax2_ies *ies, unsigned char *data, int datalen)
{
	int len = 0, ie = 0, odlen = datalen, pass=1;
	CStdString logmsg;

	memset(ies, 0, (int)sizeof(struct iax2_ies));
	while(datalen >= 2) {
		ie = data[0];
		len = data[1];

		//logmsg.Format("Looking up IE %d (len=%d)", ie, len);
                //LOG4CXX_INFO(s_iax2parsersLog, logmsg);

		if (len > datalen - 2) {
			/* Strange.  The quoted length of the IE is past the actual
			 * bounds of the IEs size */
			logmsg.Format("Error parsing IEs Pass=%d Length of IE=%d, "
					"datalen-2=%d, IE=%d, OrigDlen=%d", pass, len, datalen-2, ie, odlen);
			LOG4CXX_INFO(s_iax2parsersLog, logmsg);
			return -1;
		}

		switch(ie) {
		case IAX2_IE_CALLING_NAME:
			ies->calling_name = (char *)data + 2;
			break;
		case IAX2_IE_CALLED_NUMBER:
			ies->callee = (char *)data + 2;
			break;
		case IAX2_IE_CALLING_NUMBER:
			ies->caller = (char *)data + 2;
                        break;
		case IAX2_IE_FORMAT:
			if(len == (int)sizeof(unsigned int))
				ies->format = ntohl(get_unaligned_uint32(data+2));
			else
				ies->format = 0; /* Invalid */
			break;
		case IAX2_IE_USERNAME:
			ies->username = (char *)data + 2;
                        break;
                case IAX2_IE_AUTHMETHODS:
			if(len == (int)sizeof(unsigned int))
                                ies->authmethods = ntohl(get_unaligned_uint32(data+2));
                        else
                                ies->authmethods = 0; /* Invalid */
                        break;
                case IAX2_IE_CHALLENGE:
                        ies->challenge = (char *)data + 2;
                        break;
		default:
			/* Ignore the rest */
			break;
		}

#if 0 /* Debug headaches caused by udpHeader->len */
		char tmpt[256];
		memset(tmpt, 0, sizeof(tmpt));
		memcpy(tmpt, data+2, len);
                logmsg.Format("Got %s", tmpt);
		LOG4CXX_INFO(s_iax2parsersLog, logmsg);
#endif

		data[0] = 0;
		datalen -= (len + 2);
		data += (len + 2);
		pass++;
	}

	*data = '\0';
	if(datalen) {
		/* IE contents likely to be invalid because we should have totally
		 * consumed the entire amount of data */
                CStdString logmsg;

                logmsg.Format("Error parsing IEs. datalen left=%d", len, datalen, ie);
                LOG4CXX_INFO(s_iax2parsersLog, logmsg);

		return -1;
	}

	return 0;
}