File 0180-2175507-alloca_sockaddr.patch of Package sblim-sfcb
Index: msgqueue.c
===================================================================
RCS file: /cvsroot/sblim/sfcb/msgqueue.c,v
retrieving revision 1.25
diff -u -p -r1.25 msgqueue.c
--- msgqueue.c 16 Oct 2008 15:53:36 -0000 1.25
+++ msgqueue.c 17 Oct 2008 21:17:40 -0000
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <stddef.h>
extern unsigned long exFlags;
@@ -621,7 +622,7 @@ int getControlChars(char *id, char **val
void stopLocalConnectServer()
{
- static struct sockaddr_un serverAddr;
+ static struct sockaddr_un *serverAddr;
int sock,size=0;
unsigned long int l;
char *path;
@@ -635,11 +636,13 @@ void stopLocalConnectServer()
return;
}
- serverAddr.sun_family=AF_UNIX;
- strcpy(serverAddr.sun_path,path);
+ socklen_t serverAddrLen = offsetof(struct sockaddr_un, sun_path) +
+ strlen(path) + 1;
+ serverAddr = alloca(serverAddrLen);
+ serverAddr->sun_family=AF_UNIX;
+ strcpy(serverAddr->sun_path,path);
- if (connect(sock,(const struct sockaddr*)&serverAddr,
- sizeof(serverAddr.sun_family)+strlen(serverAddr.sun_path))<0) {
+ if (connect(sock,(const struct sockaddr*)serverAddr, serverAddrLen)<0) {
perror("connect error");
return;
}
@@ -650,7 +653,7 @@ void stopLocalConnectServer()
void localConnectServer()
{
- static struct sockaddr_un clientAddr,serverAddr;
+ static struct sockaddr_un clientAddr,*serverAddr;
int nsocket,ssocket;
unsigned int cl, notDone=1;
char *path;
@@ -667,18 +670,20 @@ void localConnectServer()
if (getControlChars("localSocketPath", &path)!=0) {
mlogf(M_INFO,M_SHOW,"--- localConnectServer failed to start\n");
}
-
+
if ((ssocket=socket(PF_UNIX, SOCK_STREAM, 0))<0) {
perror("socket creation error");
return;
}
- serverAddr.sun_family=AF_UNIX;
- strcpy(serverAddr.sun_path,path);
+ socklen_t serverAddrLen = offsetof(struct sockaddr_un, sun_path) +
+ strlen(path) + 1;
+ serverAddr = alloca(serverAddrLen);
+ serverAddr->sun_family=AF_UNIX;
+ strncpy(serverAddr->sun_path,path,sizeof(serverAddr->sun_path));
unlink(path);
- if (bind(ssocket,(const struct sockaddr*)&serverAddr,
- sizeof(serverAddr.sun_family)+strlen(serverAddr.sun_path))<0) {
+ if (bind(ssocket,(const struct sockaddr*)serverAddr, serverAddrLen)<0) {
perror("bind error");
return;
}
@@ -688,12 +693,12 @@ void localConnectServer()
do {
// sfcbSockets.send;
cl=sizeof(clientAddr);
- if ((nsocket=accept(ssocket,(struct sockaddr*)&serverAddr,&cl))<0) {
+ if ((nsocket=accept(ssocket,(struct sockaddr*)serverAddr,&cl))<0) {
perror("accept error");
/* Being interrupted isn't necessarily bad; try once more */
if (errno == EINTR) {
- if ((nsocket=accept(ssocket,(struct sockaddr*)&serverAddr,&cl))<0) {
+ if ((nsocket=accept(ssocket,(struct sockaddr*)serverAddr,&cl))<0) {
perror("accept error (2)");
return;
}