int osip_www_authenticate_to_str 和osip_message_set_www_authenticate


1.分析:函数首先获取认证字段的长度,然后动态内存分配,将osip_www_authenticate_t类型的数据复制成为一个字符串,目标地址是dest,但是导致的内存泄露也是一大隐患。

2.分析:函数首先将认证信息添加到数据报文中,然后将认证信息添加到osip_list链表,这将会大大方便函数的释放。

源代码1:

int

osip_www_authenticate_to_str (const osip_www_authenticate_t * wwwa, char **dest)
{
  size_t len;
  char *tmp;

*dest = NULL;
  if ((wwwa == NULL) || (wwwa->auth_type == NULL))
    return OSIP_BADPARAMETER;

len = strlen (wwwa->auth_type) + 1;

if (wwwa->realm != NULL)
    len = len + strlen (wwwa->realm) + 7;
  if (wwwa->nonce != NULL)
    len = len + strlen (wwwa->nonce) + 8;
  len = len + 2;
  if (wwwa->domain != NULL)
    len = len + strlen (wwwa->domain) + 9;
  if (wwwa->opaque != NULL)
    len = len + strlen (wwwa->opaque) + 9;
  if (wwwa->stale != NULL)
    len = len + strlen (wwwa->stale) + 8;
  if (wwwa->algorithm != NULL)
    len = len + strlen (wwwa->algorithm) + 12;
  if (wwwa->qop_options != NULL)
    len = len + strlen (wwwa->qop_options) + 6;

tmp = (char *) osip_malloc (len);
  if (tmp == NULL)
    return OSIP_NOMEM;
  *dest = tmp;

tmp = osip_str_append (tmp, wwwa->auth_type);

if (wwwa->realm != NULL)
    {
      tmp = osip_strn_append (tmp, " realm=", 7);
      tmp = osip_str_append (tmp, wwwa->realm);
    }
  if (wwwa->domain != NULL)
    {
      tmp = osip_strn_append (tmp, ", domain=", 9);
      tmp = osip_str_append (tmp, wwwa->domain);
    }
  if (wwwa->nonce != NULL)
    {
      tmp = osip_strn_append (tmp, ", nonce=", 8);
      tmp = osip_str_append (tmp, wwwa->nonce);
    }
  if (wwwa->opaque != NULL)
    {
      tmp = osip_strn_append (tmp, ", opaque=", 9);
      tmp = osip_str_append (tmp, wwwa->opaque);
    }
  if (wwwa->stale != NULL)
    {
      tmp = osip_strn_append (tmp, ", stale=", 8);
      tmp = osip_str_append (tmp, wwwa->stale);
    }
  if (wwwa->algorithm != NULL)
    {
      tmp = osip_strn_append (tmp, ", algorithm=", 12);
      tmp = osip_str_append (tmp, wwwa->algorithm);
    }
  if (wwwa->qop_options != NULL)
    {
      tmp = osip_strn_append (tmp, ", qop=", 6);
      tmp = osip_str_append (tmp, wwwa->qop_options);
    }

if (wwwa->realm == NULL)
    {
      /* remove comma */
      len = strlen (wwwa->auth_type);
      if ((*dest)[len] == ‘,‘)
        (*dest)[len] = ‘ ‘;
    }

return OSIP_SUCCESS;

}

源代码2:

int
osip_message_set_www_authenticate (osip_message_t * sip, const char *hvalue)
{
  osip_www_authenticate_t *www_authenticate;
  int i;

if (hvalue == NULL || hvalue[0] == ‘\0‘)
    return OSIP_SUCCESS;

if (sip == NULL)
    return OSIP_BADPARAMETER;
  i = osip_www_authenticate_init (&www_authenticate);
  if (i != 0)
    return i;
  i = osip_www_authenticate_parse (www_authenticate, hvalue);
  if (i != 0)
    {
      osip_www_authenticate_free (www_authenticate);
      return i;
    }
  sip->message_property = 2;
  osip_list_add (&sip->www_authenticates, www_authenticate, -1);
  return OSIP_SUCCESS;
}

时间: 2024-10-13 22:30:53

int osip_www_authenticate_to_str 和osip_message_set_www_authenticate的相关文章

numeric and int in sql server

类型映射 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings C#关键字 decimal https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal The decimal keyword indicates a 128-bit data type. Compa

mysql中int、bigint、smallint和tinyint的区别与长度

对比发现 int bigint smallint 和 tinyint 类型,如果创建新表时没有指定 int(M) 中的M时,默认分别是 : int             -------     int(11) bigint       -------     bigint(20) smallint   -------     smallint(6) tinyint     -------     tinyint(4) 下面是这几种类型的取值范围 参考:http://www.2cto.com/d

int、str、list、tuple、dict补充

一.int a = 123 b = a# a与b指向同一个地址值 c = 123 d = 123 e = 123 #d.c.e当在-5~257这个范围时,都指向一个地址值(Python优化的结果,当超出这个范围,id与之不同) 二.str a. name = "你猜" for i in name: print(i) bytes_name = bytes(i, encoding='utf-8')# 字符转换成字节 print(byte_name)# 16进制表示 for byte in

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

C# 与数据库中字段类型 Int16(short), Int32(int), Int64(long)的取值范围、区别 。string长度

一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等于byte, Int16, 等于short, 占2个字节. -32768 32767 Int32, 等于int, 占4个字节. -2147483648 2147483647 Int64, 等于long, 占8个字节. -9223372036854775808 9223372036854775807

C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)

1 #include<iostream> 2 #include<string> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 cout << "type: \t\t" << "************size**************"<< endl; 9 cout << "bool: \t

mysql中bigint、int、mediumint、smallint 和 tinyint的取值范

mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,搜集了些资料,整理分享出来,这篇为有关mysql整型bigint.int.mediumint.smallint 和 tinyint的语法介绍,如下:1.bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),无符号的范围是0到 18446744073709551615.一位为 8 个字节. 2.int 一个正常大小整数.有符号

Reverse Integer - 反转一个int,溢出时返回0

Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 若反转的数溢出,直接返回0 可以用计算结果来判断溢出,也可以用因数来判断 Java代码实现: 1 public class ReverseInteger { 2 public static int reverseInt(int x){ 3 if (x == 0) { 4 return

Int.Parse与ConvertToInt的区别

最近在公司做一个项目的时候,在某次 跟组长讨论的时候.对一个简单的线发生了一些讨论.感觉挺有收获的.现在来总结一下. 在代码开发的时候,底层代码,不要写try-catch.因为写异常处理之后,代码的执行效率会大大的降低.底层的代码,不写异常,但是要经过严格的测试,确保正确.而对于界面层来说,必须接收异常.程序崩溃是非常不友好的.而且也降低了用户对你程序的信任. 对几个小问题的整理: 1.try-catch是否影响效率 自己简单测试了一下,感觉不到效率有什么变化. 然后查找一系列相关博客.发现了一