在执行.mp3文件时,在strlen()周围出现分段错误

时间:2017-04-24 21:11:41

标签: c server

  

每当我尝试提供像/home/..../TulsaQueen.mp3这样的文件时,程序会产生分段错误。 gdb说它与strlen()有关,但我无法弄明白。为什么会这样?   我正在创建一个服务器,需要处理GET请求我的.jpg每次都有效,但.mp3没有。

@columnsvalue
  

这是我得到的错误

     

线程2“a.out”收到信号SIGSEGV,分段故障。   (gdb)在哪里   (0)strlen()at ../sysdeps/x86_64/strlen.S:106(1)   位于ioputs.c的_IO_puts(str = 0x0)中的0x00007ffff764069c:35(2)   0x00000000401623在connectionThread()(3)0x00007ffff7bc16ba中   start_thread(arg = 0x7ffff73b6700)at pthread_create.c:333(4)   clone()中的0x00007ffff76d782d   ../ sysdeps / UNIX / SYSV / LINUX / x86_64的/ clone.S:109

1 个答案:

答案 0 :(得分:0)

代码中的一个可能解释问题的错误与缓冲区大小memsetread ...

有关。

缓冲区长度恰好为1024字节。将所有这些字节设置为0,然后读取最多1024个字节。

但是,当您在末尾读取没有任何NUL(0)字节的1024个字节时会发生什么? ...

...如果发生这种情况,strlen会在搜索NUL字节时溢出(在字节1025及之后),导致分段错误。

解决这个特定问题的一种方法是读取1023个字节......即:

memset(buffer, 0, 1024);
n = read(newsockfd,buffer,1023);

解决此特定问题的更好方法(如注释中所示)将使用n来设置NUL字节值。即:

n = read(newsockfd,buffer,1023);
if (n < 0) {
   // ...
}
buffer[n] = 0;

这样可以确保NUL字节始终存在于分配的缓冲区中。

我应该指出,用strtok标记字符串,以及使用str*函数来解析传入的数据,有点无效,可能会产生意外的错误/结果......

...尤其是当您处于多线程环境中时......

例如,strtok 是线程安全的......即使存在线程安全的变体,但它也不太理想。

此外,它可能会无意中破坏传入的数据 - 毕竟,您只使用第一个&#34;令牌&#34;,所以我假设您希望其余数据保持不变。

祝你好运!

P.S。

  • strlen(magic_file(myt,token)) - 如果magic_file(myt,token)是无效字符串(即NULL)怎么办?

  • strlen("\r\n\r\n")总是4 ...为什么要为此使用函数调用?

  • free(buffer)应该是free(str_size)