iconv的问题

sdn_prc 2012-08-20 08:02:43
char charset[16] = {0};

// =?UTF-8?B?5o6i57Si56We5puy6ZqQ6JeP5Zyo6IOM5ZCO55qE56eY5a+G?=
bool decode_subject(char *subject)
{
static char *iconvob = NULL;
static iconv_t cd = (iconv_t)-1;

char *p1, *p2;
size_t insz, outsz;

if(!strstr(subject, "=?"))
return true;

p1 = strchr(subject + 2, '?');
memcpy(charset, subject + 2, p1 - subject - 2);
charset[p1 - subject - 2] = 0;
#ifdef DEBUG
fprintf(stderr, "charset: %s\n", charset);
#endif
p1 += 3;

p2 = strrchr(p1, '?');

if(cd == (iconv_t)-1) {
cd = iconv_open("UTF-8", charset);
if(cd == (iconv_t)-1) {
perror("iconv_open()");
return false;
}
}
if(!iconvob) {
iconvob = (char *)malloc(256);
if(!iconvob) {
fprintf(stderr, "malloc() failed\n");
return false;
}
}
memset(iconvob, 0, 256);
insz = p2 - p1;
if(iconv(cd, &p1, &insz, &iconvob, &outsz) == (size_t)-1) {
iconv_close(cd);
perror("iconv()");
return false;
}

strcpy(subject, iconvob);

return true;
}


参数subject意指email的标题,形如“=?UTF-8?B?5o6i57Si56We5puy6ZqQ6JeP5Zyo6IOM5ZCO55qE56eY5a+G?=”,根据MIME,“=?UTF-8?B?”和结尾的“?=”都是固定的部分。

decode_subject函数,想解析出编码(如UTF-8),并把经iconv转换后的数据(NULL-terminated C string)再存入subject参数所指的空间。

错误是:
Program terminated with signal 6, Aborted.
#0 0xb7719424 in __kernel_vsyscall ()

以上的函数,有什么问题呢?我看不出来。bt看,一定是这个函数的问题,但不单步的话,也定位不了问题。
...全文
163 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-08-21
  • 打赏
  • 举报
回复
你的函数第一遍调用不会core,第二次调用会core掉,因为iconv修改了size参数,也就是修改了iconvob里存的地址,调用完iconv后iconvob还没用光,iconvob被修改指向了某个buffer内的位置,因为你之前memset过,所以strcpy可能没有问题。

第二次调用为什么会core? 因为第一次Iconvob已经被改到buffer很后面的位置了,第二次你判断iconvob的确非空,于是继续iconv,此时iconvob可不够用了就非法操作了。

另外,你代码本来就有问题,outsz根本没初始化,你起码也应该赋值它为256.
sdn_prc 2012-08-21
  • 打赏
  • 举报
回复
谢谢提醒。MIME对非ascii邮件标题的处理,以前看过相关RFC,但你说之前完全忘了。

我本来的问题,iconv在这里的使用,问题是?
qq120848369 2012-08-21
  • 打赏
  • 举报
回复
哥, 这是base64后的utf8,请你先base64_decode后再iconv。
sdn_prc 2012-08-21
  • 打赏
  • 举报
回复
在decode_subject()中,用一个static变量(static char *iconvob_head)记录iconvob的刚分配空间是的头,以后每次调用iconv,判断iconvob与iconvob_head是否相等,不相等的话,赋iconv_head给iconv,core的问题解决。

附上man 3 iconv中,与此bug相关的信息:
The iconv function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements *inbytesleft by the number of converted input
bytes, it increments *outbuf and decrements *outbytesleft by the number of converted output bytes, and it updates the conversion state contained in cd.
sdn_prc 2012-08-21
  • 打赏
  • 举报
回复
针对iconv调用的问题,应该怎么改呢?
sdn_prc 2012-08-21
  • 打赏
  • 举报
回复
outsz忘了初始化或赋值,确实是问题,但其实我发帖后就发现了,马上就改了(outsz = 255;)。core依旧。

另外,为什么core的signal是SIGABRT,不是SIGSEGV。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧