蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 | -->
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程 -->


    

蓝森林 http://www.lslnet.com 2006年8月16日 14:08

sprintf出现SIGSEGV怎么处理?

[Switching to Thread -1208890448 (LWP 4724)]

Breakpoint 1, readconf (args=0x0) at test.c:215
215 bzero(query,sizeof(char)*BUFFSIZE);
(gdb) next
216 sprintf(query,
(gdb) next
219 if(mysql_query(mysql,query))
(gdb) next
230 if(mysql_affected_rows(mysql)<=0)
(gdb) next
245 bzero(query,sizeof(char)*BUFFSIZE);
(gdb) print query
$1 = "SELECT * FROM TBL_IFCONFIG WHERE FLD_ETHNAME='eth0'", '\0' <repeats 972 times>
(gdb) next
246 sprintf(query,
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x008de72f in vfprintf () from /lib/libc.so.6

程序源码如下(红色标记为第215行,绿色标记行为出错语句):
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <signal.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <mysql/mysql.h>
#include <errno.h>

#define IFRSIZE ((int)(sizeof(struct ifreq)))

#define ADDR (unsigned char)ifr[i].ifr_addr.sa_data[2],\
(unsigned char)ifr[i].ifr_addr.sa_data[3],\
(unsigned char)ifr[i].ifr_addr.sa_data[4],\
(unsigned char)ifr[i].ifr_addr.sa_data[5]

#define MAC (unsigned char)ifr[i].ifr_addr.sa_data[0],\
(unsigned char)ifr[i].ifr_addr.sa_data[1],\
(unsigned char)ifr[i].ifr_addr.sa_data[2],\
(unsigned char)ifr[i].ifr_addr.sa_data[3],\
(unsigned char)ifr[i].ifr_addr.sa_data[4],\
(unsigned char)ifr[i].ifr_addr.sa_data[5]

#define ADDR_FAMILY ifr[i].ifr_addr.sa_family
#define ADDR_FORMAT "%d.%d.%d.%d"
#define HW_ADDR_FORMAT "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x"

#define BUFFSIZE 1024

//------Mysql server define
#define MYSQL_HOST "127.0.0.1"
#define MYSQL_USER "root"
#define MYSQL_PASSWD ""
#define DATABASE "DB_FIREWALL"


sem_t if_sem,mysql_sem;

MYSQL *mysql_conn_init(char *host,char *user,char *pwd,char *db)
{
MYSQL *mysql;
mysql=(MYSQL *)malloc(sizeof(MYSQL));
if(mysql==NULL)
return NULL;
if(mysql_init(mysql)==NULL)
{
return NULL;
}
if(!mysql_real_connect(mysql,host,user,pwd,NULL,0,NULL,0))
{
return NULL;
}
if(mysql_select_db(mysql,db)!=0)
{
return NULL;
}
return mysql;
}


void *readconf(void *args)
{
int sockfd,count=0,i,j;
unsigned char hw[6];
struct ifreq *ifr;
struct ifconf ifc;
short int flags=0;
char device[8];
char ip[20];
char mask[20];
char broad[20];
char hw_addr[28];
char status[6];

MYSQL *mysql;
char query[BUFFSIZE];
char query1[BUFFSIZE];

sem_wait(&if_sem);

sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);
if(sockfd<0)
{
fprintf(stderr,"Cannot open socket.\n");
sem_post(&if_sem);
pthread_exit((void *)EXIT_FAILURE);
}
ifc.ifc_req=NULL;
if((ioctl(sockfd,SIOCGIFCONF,&ifc))<0)
{
fprintf(stderr,"Cannot Read config!\n");
sem_post(&if_sem);
pthread_exit((void *)EXIT_FAILURE);
}
count=ifc.ifc_len/IFRSIZE;
ifc.ifc_req=(struct ifreq *)malloc(IFRSIZE*count);
if((ioctl(sockfd,SIOCGIFCONF,&ifc))<0)
{
fprintf(stderr,"Read config failure!\n");
sem_post(&if_sem);
free(ifc.ifc_req);
pthread_exit((void *)EXIT_FAILURE);
}
//printf("Buf Len: %d\n",ifc.ifc_len); //for test
ifr=ifc.ifc_req;
if(ifr!=NULL)
{
//---------Mysql Init-----------
sem_wait(&mysql_sem);
mysql=mysql_conn_init(
MYSQL_HOST,
MYSQL_USER,
MYSQL_PASSWD,
DATABASE);
if(NULL==mysql)
{
fprintf(stderr,"Mysql init failure!\n");
sem_post(&if_sem);
sem_post(&mysql_sem);
free(ifr);
pthread_exit((void *)EXIT_FAILURE);
}
for(i=0;i<count;i++)
{
if(ADDR_FAMILY!=AF_INET)
continue;
sprintf(device,"%s",ifr[i].ifr_name);
//------Start to get FLAGS------------------
if((ioctl(sockfd,SIOCGIFFLAGS,&ifr[i]))<0)
{
fprintf(stderr,"Read FLAGS failure!\n");
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);
pthread_exit((void *)EXIT_FAILURE);
}
flags=ifr[i].ifr_flags;
if(flags&IFF_LOOPBACK)
continue;
if(flags&IFF_UP)
sprintf(status,"UP");
else
sprintf(status,"DOWN");
//----Start to Get IP----------
if((ioctl(sockfd,SIOCGIFADDR,&ifr[i]))<0)
{
fprintf(stderr,"Read ip config failure!\n");
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);

sem_post(&mysql_sem);
free(ifr);
pthread_exit((void *)EXIT_FAILURE);
}
sprintf(ip,ADDR_FORMAT,ADDR);
//-----Start to Get NetMask
if((ioctl(sockfd,SIOCGIFNETMASK,&ifr[i]))<0)
{
fprintf(stderr,"Read NetMask config failure!\n");
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);

pthread_exit((void *)EXIT_FAILURE);
}
sprintf(mask,ADDR_FORMAT,ADDR);
//-----Start to get BroadCast Address-------
if((ioctl(sockfd,SIOCGIFBRDADDR,&ifr[i]))<0)
{
fprintf(stderr,"Read BroadCastAddr failure!\n");
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);

pthread_exit((void *)EXIT_FAILURE);
}
sprintf(broad,ADDR_FORMAT,ADDR);
//------Start to get MAC--------------------
if((ioctl(sockfd,SIOCGIFHWADDR,&ifr[i]))<0)
{
fprintf(stderr,"Read MAC failure!\n");
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);

pthread_exit((void *)EXIT_FAILURE);
}
sprintf(hw_addr,HW_ADDR_FORMAT,MAC);

//-------Output for test--------------------
printf("Device: %s\n",device);
printf("\tIP:\t%s\n",ip);
printf("\tMASK:\t%s\n",mask);
printf("\tBraod:\t%s\n",broad);
printf("\tMAC:\t%s\n",hw_addr);
printf("\tSTATUS:\t%s\n",status);
//-----Save to Mysql db----------------------
bzero(query,sizeof(char)*BUFFSIZE);
sprintf(query,
"SELECT * FROM TBL_IFCONFIG WHERE FLD_ETHNAME='%s'",
device);
if(mysql_query(mysql,query))
{
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);

fprintf(stderr,"Mysql query error: %s\n",query);
pthread_exit((void *)EXIT_FAILURE);
}
if(mysql_affected_rows(mysql)<=0)
{
bzero(query,sizeof(char)*BUFFSIZE);
sprintf(query,
"INSERT INTO TBL_IFCONFIG(FLD_INDEX,FLD_ETHNAME,FLD_IPADDR,FLD_NETMASK,FLD_BROADADDR,FLD_IFSTATUS,FLD_MAC) VALUES(%d,'%s','%s','%s','%s','%s','%s')",
i+1,
device,
ip,
mask,
broad,
status,
hw_addr);

}
else
{
bzero(query,sizeof(char)*BUFFSIZE);
sprintf(query,
"UPDATE TBL_IFCONFIG SET FLD_IPADDR='%s',FLD_NETMASK='%s',FLD_BROADADDR='%s',FLD_IFSTATUS='%s',FLD_MAC='%s' WHERE FLD_ETHNAME='%s'",
ip,
mask,
broad,
status,
hw_addr);
}
if(mysql_query(mysql,query1))
{
sem_post(&if_sem);
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);

fprintf(stderr,"Mysql query error:%s\n",query);
pthread_exit((void *)EXIT_FAILURE);
}
}
mysql_close(mysql);
free(mysql);
sem_post(&mysql_sem);
free(ifr);
}
close(sockfd);
sem_post(&if_sem);

pthread_exit((void *)EXIT_SUCCESS);

}
int main()
{
pthread_t thread_readconf;
int *ret;
if((sem_init(&if_sem,0,1))!=0)
{
perror("Semphore \"if_sem\" init failure!\n");
return EXIT_FAILURE;
}
if((sem_init(&mysql_sem,0,1))!=0)
{
perror("Semphore \"mysql_sem\" init failure!\n");
return EXIT_FAILURE;
}
ret=(int *)malloc(sizeof(int));
if(NULL==ret)
{
perror("Init return code error!\n");
return EXIT_FAILURE;
}
*ret=0;
pthread_create(&thread_readconf,NULL,readconf,NULL);
pthread_join(thread_readconf,(void *)ret);
free(ret);
return EXIT_SUCCESS;

}




Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com