Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C带packetsender插槽的内存泄漏_Java_C_Sockets_Memory Leaks_Java Native Interface - Fatal编程技术网

Java C带packetsender插槽的内存泄漏

Java C带packetsender插槽的内存泄漏,java,c,sockets,memory-leaks,java-native-interface,Java,C,Sockets,Memory Leaks,Java Native Interface,大家好,我正在尝试为使用JNI的SIP应用程序编写具有IP欺骗功能的packetsender共享库,当我尝试运行应用程序并调用本机方法时,在开始时没有出现任何问题,但在一段时间后,我认为内存泄漏没有任何跟踪,并导致JVM崩溃,我的C代码(如下)这是我用JNI调用的方法,有人能帮我找到漏洞吗 int send_message(const char * sip_msg, const char * dest_ip, int dest_port, const char * spoofed_ip, uns

大家好,我正在尝试为使用JNI的SIP应用程序编写具有IP欺骗功能的packetsender共享库,当我尝试运行应用程序并调用本机方法时,在开始时没有出现任何问题,但在一段时间后,我认为内存泄漏没有任何跟踪,并导致JVM崩溃,我的C代码(如下)这是我用JNI调用的方法,有人能帮我找到漏洞吗

int send_message(const char * sip_msg, const char * dest_ip, int dest_port, const char * spoofed_ip, unsigned int source_port){
unsigned int source_ip = 0;
srand(time(0));
if(source_port == 0){
    source_port = rand() % 65535;
}
//unsigned int source_port = 0;
struct ip *ip;
struct udphdr *udp;
unsigned char packet[65535];
int len;
unsigned int msg_len =strlen(sip_msg);

struct sockaddr_in serv_addr;

int sockfd;
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
    printf("\n Error : Could not create socket \n");
    return 1;
}

const int on = 1;
if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1) {
    perror("\n Error : Set Sock Opt \n");
    return 1;
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(dest_port);
serv_addr.sin_addr.s_addr = inet_addr(dest_ip);

len = sizeof(struct ip) + sizeof(struct udphdr) + msg_len;

if (len > sizeof(packet)) {
    printf("Failed to send1!\n");
    return -2;
}

ip = (struct ip*) packet;
udp = (struct udphdr *) (packet + sizeof(struct ip));
memcpy(packet+sizeof(struct ip)+sizeof(struct udphdr),sip_msg,msg_len);


ip->ip_v = 4;
ip->ip_hl = sizeof(struct ip) / 4; // no options
ip->ip_tos = 0;
ip->ip_len = htons(len);
ip->ip_id = 23;
ip->ip_off = 0;
ip->ip_ttl = 69;
ip->ip_p = 17;
ip->ip_src.s_addr = inet_addr(spoofed_ip);
ip->ip_dst.s_addr = inet_addr(dest_ip);

ip->ip_sum = checksum((unsigned char *) ip, sizeof(struct ip));

/*if (source_port == 0) {
    source_port = 5060;
}*/

udp->source = htons(source_port);
udp->dest = serv_addr.sin_port;
udp->len = htons((unsigned short) sizeof(struct udphdr) + msg_len);
udp->check = 0;

if (sendto(sockfd, packet, len, 0, (struct sockaddr *) (&serv_addr),
        sizeof(struct sockaddr_in)) == -1) {
    return -2;
    printf("Failed to send!\n");
}

    close(sockfd);


return 0;}
int send_message(const char*sip_msg,const char*dest_ip,int dest_port,const char*spoofed_ip,未签名的int源_port){
无符号整数源_ip=0;
srand(时间(0));
如果(源端口==0){
source_port=rand()%65535;
}
//无符号整数源\端口=0;
结构ip*ip;
结构udphdr*udp;
无符号字符包[65535];
内伦;
无符号整数msg_len=strlen(sip_msg);
服务地址中的结构sockaddr\u;
int-sockfd;
如果((sockfd=套接字(AF_INET,SOCK_RAW,IPPROTO_RAW))<0){
printf(“\n错误:无法创建套接字\n”);
返回1;
}
const int on=1;
如果(设置锁存选项(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))=-1){
perror(“\n错误:设置Sock Opt\n”);
返回1;
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(dest_port);
serv_addr.sin_addr.s_addr=inet_addr(dest_ip);
len=sizeof(struct ip)+sizeof(struct udphdr)+msg_len;
if(len>sizeof(数据包)){
printf(“未能发送1!\n”);
返回-2;
}
ip=(结构ip*)数据包;
udp=(结构udphdr*)(数据包+sizeof(结构ip));
memcpy(packet+sizeof(struct ip)+sizeof(struct udphdr)、sip_msg、msg_len);
ip->ip_v=4;
ip->ip_hl=sizeof(struct ip)/4;//无选项
ip->ip_tos=0;
ip->ip_len=htons(len);
ip->ip_id=23;
ip->ip_off=0;
ip->ip_ttl=69;
ip->ip_p=17;
ip->ip\u src.s\u addr=inet\u addr(欺骗ip);
ip->ip_dst.s_addr=inet_addr(dest_ip);
ip->ip_sum=校验和((无符号字符*)ip,sizeof(结构ip));
/*如果(源端口==0){
源端口=5060;
}*/
udp->source=htons(源端口);
udp->dest=serv\u addr.sin\u端口;
udp->len=htons((无符号短)sizeof(struct udphdr)+msg_len);
udp->check=0;
if(sendto(sockfd,packet,len,0,(struct sockaddr*))(&serv_addr),
sizeof(结构sockaddr_in))=-1){
返回-2;
printf(“发送失败!\n”);
}
关闭(sockfd);
返回0;}
是的,我可以找到漏洞,但不一定是漏洞


考虑一下如果发送失败会发生什么情况,例如
sendto
。已使用
socket()
打开套接字,但您没有关闭它。您确实需要
关闭可采用的所有代码路径的套接字。顺便说一句,在这种情况下,使用
goto
可能是个好主意。

您是否尝试过类似libpcap包装库的方法?您可以使用库来完成此操作,而无需编写此低级代码。i、 e.不需要C代码。@PeterLawrey我以前听过但从未使用过:)你能用这个库给我发送一些UDP示例吗?谷歌很快发现我没有尝试过。所以我猜你是说当sendto失败时套接字保持打开状态,当超时时如果发生太多sendto失败,那么套接字保持打开状态,这会导致内存泄漏我是一个是吗?是的,我就是这么说的。我不确定这是你的漏洞,但这仍然是一个你应该解决的问题。除
sendto
故障外,还修复其他代码路径。