免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yvonne88
打印 上一主题 下一主题

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!! [复制链接]

论坛徽章:
0
41 [报告]
发表于 2005-09-13 07:48 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

原帖由 "雨丝风片" 发表:


caddr_t是(至少是BSD协议栈里面)使用的一种“通用”指针,
我现在手头没有成套的代码,就不去查它的定义了,但印象里应该
就是char *。之所以在名字中含有addr,是因为在BSD协议栈里面,
这种类型的指针是用..........


拿到代码,找到定义:
sys/types.h

  1. typedef    char *        caddr_t;    /* core address */
复制代码

论坛徽章:
0
42 [报告]
发表于 2005-09-13 08:04 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

楼上的老头子,你精神真好啊

论坛徽章:
0
43 [报告]
发表于 2005-09-13 08:27 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

[quote]原帖由 "luojiannx"]楼上的老头子,你精神真好啊[/quote 发表:


晚睡早起身体好!可惜cu上不兴抢第一盆水。。。呵呵!

论坛徽章:
0
44 [报告]
发表于 2005-09-13 08:39 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

从getpskbyaddr()函数来看,key = getpsk(addr, strlen(addr)); 能正常返回,但在 return key; 后段错误,说明是这个函数的局部变量溢出,所以查一下addr数组有没有溢出,至少把它打出来看看吧
看一下GETNAMEINFO这个宏是怎么处理的?

论坛徽章:
0
45 [报告]
发表于 2005-09-13 08:47 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

谢谢,谢谢,开工了,我打出来看看,

论坛徽章:
0
46 [报告]
发表于 2005-09-13 09:58 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

又有新发现了,大伙再帮帮忙: 发现key返回前后的值发生了变化.



                                                                                 
                                                                           
  1. vchar_t *
  2. getpskbyaddr(remote)
  3.         struct sockaddr *remote;
  4. {
  5.         vchar_t *key = NULL;
  6.         char addr[NI_MAXHOST], port[NI_MAXSERV];
  7.                                                                                  
  8.         GETNAMEINFO(remote, addr, port);
  9. #ifdef CYH
  10. printf("\n begin getpsk funtion\n");
  11. #endif
  12.         key = getpsk(addr, strlen(addr));
  13. #ifdef CYH
  14. if(NULL==key)printf("\n key is NULL\n");
  15. printf("\n end getpsk\n");

  16. [color=red]我在此处将key的值打印出来,显示结果: key与getpsk函数返回之前的key的值不同;返回前后,怎么会发生变化呢?这意味什么错误?[/color]

  17. #endif
  18.         return key;
  19. }
复制代码

论坛徽章:
0
47 [报告]
发表于 2005-09-13 09:58 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

我在此处将key的值打印出来,显示结果: key与getpsk函数返回之前的key的值不同;返回前后,怎么会发生变化呢?这意味什么错误?
怎么不显示红色啊?

论坛徽章:
0
48 [报告]
发表于 2005-09-13 10:16 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

把你的getpsk()贴出来
getpskbyaddr()是不是与你正在用的有出入?把完整的代码贴出来吧

论坛徽章:
0
49 [报告]
发表于 2005-09-13 10:29 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

问题就在这
key = getpsk(addr, strlen(addr));
addr是局部变量,用key指针指向了一块随时会被重写的地址空间,很不可靠,
建议addr用静态标识。

论坛徽章:
0
50 [报告]
发表于 2005-09-13 10:29 |只看该作者

好奇怪的段错误啊?半天没找出来,高手帮帮小妹啊!!!

  1. static vchar_t *
  2. ident_ir2mx(iph1)
  3.       struct ph1handle *iph1;
  4. {
  5.       vchar_t *buf = 0;
  6.    struct isakmp_gen *gen;
  7.       char *p;
  8.       int tlen;
  9.       int need_cr = 0;
  10.       vchar_t *cr = NULL;
  11.       vchar_t *vid = NULL;
  12.       /*by yvonne*/
  13.       vchar_t *h_psk=NULL;
  14.       vchar_t *hpsk=NULL;
  15.       /*by yvonne*/
  16.       int error = -1;
  17.       int nptype;
  18. /* create buffer
  19.       */
  20.       tlen = sizeof(struct isakmp)
  21.            + sizeof(*gen) + iph1->;dhpub->;l
  22.            + sizeof(*gen) + iph1->;nonce->;l;
  23. #ifdef CYH
  24. printf("\nnext is by yvonne\n");
  25. #endif
  26. /* by yvonne */
  27. if(iph1->;side==INITIATOR&&iph1->;approval->;authmethod==OAKLEY_ATTR_AUTH_METHOD_PSKEY&&iph1->;etype == ISAKMP_ETYPE_IDENT)
  28. {
  29. //取psk,给hpsk赋值
  30. #ifdef CYH
  31. printf("\nbegin getpskbyaddr function");
  32. #endif
  33.                                                                                        
  34. if(NULL==(hpsk=getpskbyaddr(iph1->;remote)))
  35.     printf("\n hpsk is NULL\n");
  36.                                                                                        
  37. #ifdef CYH
  38. printf("\n finish  getpskbyaddr, begin eay_md5_one function");
  39. #endif
  40.                                                                                        
  41.   iph1->;h_psk= eay_md5_one(hpsk);
  42.                                                                                        
  43. #ifdef CYH
  44. printf("end eay_md5_one function");
  45. #endif
  46.                                                                                        
  47.   tlen += sizeof(*gen) + h_psk->;l;
  48. }
复制代码

getpskbyaddr代码:
/*
* get PSK by address.
*/
  1. vchar_t *
  2. getpskbyaddr(remote)
  3.         struct sockaddr *remote;
  4. {
  5.         vchar_t *key = NULL;
  6.         char addr[NI_MAXHOST], port[NI_MAXSERV];

  7.         GETNAMEINFO(remote, addr, port);
  8. #ifdef CYH
  9. printf("\n begin getpsk funtion\n");
  10. #endif
  11.         key = getpsk(addr, strlen(addr));
  12. #ifdef CYH
  13. if(NULL==key)printf("\n key is NULL\n");
  14. printf("\n end getpsk\n");
  15. printf("\nbeing return key in getpskbyaddr function");
  16. #endif
  17.         return key;
  18. }
复制代码

getpsk代码:

  1. static vchar_t *
  2. getpsk(str, len)
  3.         const char *str;
  4.         const int len;
  5. {
  6.         FILE *fp;
  7.         char buf[1024];        /* XXX how is variable length ? */
  8.         vchar_t *key = NULL;
  9. //        vchar_t *hpsk = NULL;
  10.         char *p, *q;
  11.         size_t keylen;
  12.         char *k = NULL;
  13. //验证文件的安全性并只读打开文件
  14.         if (safefile(lcconf->;pathinfo[LC_PATHTYPE_PSK], 1) == 0)
  15.                 fp = fopen(lcconf->;pathinfo[LC_PATHTYPE_PSK], "r");
  16.         else
  17.                 fp = NULL;
  18.         if (fp == NULL) {
  19.                 plog(LLV_ERROR, LOCATION, NULL,
  20.                         "failed to open pre_share_key file %s\n",
  21.                         lcconf->;pathinfo[LC_PATHTYPE_PSK]);
  22.                 return NULL;
  23.         }
  24. //读入存储区
  25. #ifdef CYH
  26. printf("\nread cunchun\n");
  27. #endif
  28.         while (fgets(buf, sizeof(buf), fp) != NULL) {
  29.                 /* comment line 忽略 */
  30.                 if (buf[0] == '#')
  31.                         continue;

  32.                 /* search the end of 1st string. */
  33.                 for (p = buf; *p != '\0' && !isspace(*p); p++)
  34.                         ;
  35.                 if (*p == '\0')
  36.                         continue;        /* no 2nd parameter */
  37.                 *p = '\0';
  38.                 /* search the 1st of 2nd string. */
  39.                 while (isspace(*++p))
  40.                         ;
  41.                 if (*p == '\0')
  42.                         continue;        /* no 2nd parameter */

  43.                         p--;

  44.                 if (strncmp(buf, str, len) == 0 && buf[len] == '\0') {
  45.                         p++;
  46.                         keylen = 0;
  47.                         for (q = p; *q != '\0' && *q != '\n'; q++)
  48.                                 keylen++;
  49.                         *q = '\0';

  50.                         /* fix key if hex string */
  51.                         if (strncmp(p, "0x", 2) == 0) {
  52.                                 k = str2val(p + 2, 16, &keylen);
  53.                                 if (k == NULL) {
  54.                                         plog(LLV_ERROR, LOCATION, NULL,
  55.                                                 "failed to get psk buffer.\n");
  56.                                         goto end;
  57.                                 }
  58.                                 p = k;
  59.                         }

  60.                         key = vmalloc(keylen);
  61.                         if (key == NULL) {
  62.                                 plog(LLV_ERROR, LOCATION, NULL,
  63.                                         "failed to allocate key buffer.\n");
  64.                                 goto end;
  65.                         }
  66.                         memcpy(key->;v, p, key->;l);
  67.                         if (k)
  68.                                 racoon_free(k);
  69.                         goto end;
  70.                 }
  71.         }

  72. end:
  73.         fclose(fp);
  74.         return key;
  75. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP