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); }
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
/*! * \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(); } }
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; }