Selaa lähdekoodia

fixed bug due to assumption that 'str' is the same as 'struct iovec' (used by writev).
this occurs only on 64 bit machines.

Raphael Coeffic 20 vuotta sitten
vanhempi
commit
ed477dbc0c
1 muutettua tiedostoa jossa 40 lisäystä ja 35 poistoa
  1. 40 35
      modules/tm/t_fifo.c

+ 40 - 35
modules/tm/t_fifo.c

@@ -87,7 +87,12 @@ int tm_unix_tx_timeout = 2; /* Default is 2 seconds */
 #define TWRITE_PARAMS          20
 #define TWRITE_VERSION_S       "0.3"
 #define TWRITE_VERSION_LEN     (sizeof(TWRITE_VERSION_S)-1)
-#define eol_line(_i_)          ( lines_eol[2*(_i_)] )
+
+#define eol_line_s(_i_)        ( iov_lines_eol[2*(_i_)].iov_base )
+#define eol_line_len(_i_)      ( iov_lines_eol[2*(_i_)].iov_len )
+
+#define eol_line(_i_,_s_)      { eol_line_s(_i_) = (_s_).s; \
+                                 eol_line_len(_i_) = (_s_).len; }
 
 #define IDBUF_LEN              128
 #define ROUTE_BUFFER_MAX       512
@@ -118,8 +123,8 @@ int tm_unix_tx_timeout = 2; /* Default is 2 seconds */
 		append_chr(s,'>');len++;\
 	} while(0)
 
-static str   lines_eol[2*TWRITE_PARAMS];
-static str   eol={"\n",1};
+static struct iovec iov_lines_eol[2*TWRITE_PARAMS];
+static struct iovec eol={"\n",1};
 
 static int sock;
 
@@ -506,14 +511,14 @@ int init_twrite_lines()
 
 	/* init the line table */
 	for(i=0;i<TWRITE_PARAMS;i++) {
-		lines_eol[2*i].s = 0;
-		lines_eol[2*i].len = 0;
-		lines_eol[2*i+1] = eol;
+		iov_lines_eol[2*i].iov_base = 0;
+		iov_lines_eol[2*i].iov_len = 0;
+		iov_lines_eol[2*i+1] = eol;
 	}
 
 	/* first line is the version - fill it now */
-	eol_line(0).s   = TWRITE_VERSION_S;
-	eol_line(0).len = TWRITE_VERSION_LEN;
+	eol_line_s(0)   = TWRITE_VERSION_S;
+	eol_line_len(0) = TWRITE_VERSION_LEN;
 
 	return 0;
 }
@@ -538,7 +543,7 @@ static int inline write_to_fifo(char *fifo, int cnt )
 
 	/* write now (unbuffered straight-down write) */
 repeat:
-	if (writev(fd_fifo, (struct iovec*)lines_eol, 2*cnt)<0) {
+	if (writev(fd_fifo, iov_lines_eol, 2*cnt)<0) {
 		if (errno!=EINTR) {
 			LOG(L_ERR, "ERROR:tm:write_to_fifo: writev failed: %s\n",
 				strerror(errno));
@@ -842,7 +847,7 @@ static int assemble_msg(struct sip_msg* msg, struct tw_info *twi)
 	append_chr(s,'.');
 	append.len = s-append.s;
 
-	eol_line(1).s = s = cmd_buf;
+	eol_line_s(1) = s = cmd_buf;
 	if(twi->action.len+12 >= CMD_BUFFER_MAX){
 		LOG(L_ERR,"assemble_msg: buffer overflow while "
 		    "copying command name\n");
@@ -850,31 +855,31 @@ static int assemble_msg(struct sip_msg* msg, struct tw_info *twi)
 	}
 	append_str(s,"sip_request.",12);
 	append_str(s,twi->action.s,twi->action.len);
-	eol_line(1).len = s-eol_line(1).s;
+	eol_line_len(1) = s - (char*)eol_line_s(1);
 
-	eol_line(2)=REQ_LINE(msg).method;     /* method type */
-	eol_line(3)=msg->parsed_uri.user;     /* user from r-uri */
-	eol_line(4)=msg->parsed_uri.host;     /* domain */
+	eol_line(2,REQ_LINE(msg).method);     /* method type */
+	eol_line(3,msg->parsed_uri.user);     /* user from r-uri */
+	eol_line(4,msg->parsed_uri.host);     /* domain */
 
-	eol_line(5)=msg->rcv.bind_address->address_str; /* dst ip */
+	eol_line(5,msg->rcv.bind_address->address_str); /* dst ip */
 
-	eol_line(6)=msg->rcv.dst_port==SIP_PORT ?
-			empty_param : msg->rcv.bind_address->port_no_str; /* port */
+	eol_line(6,msg->rcv.dst_port==SIP_PORT ?
+			empty_param : msg->rcv.bind_address->port_no_str); /* port */
 
 	/* r_uri ('Contact:' for next requests) */
-	eol_line(7)=msg->first_line.u.request.uri;
+	eol_line(7,msg->first_line.u.request.uri);
 
 	/* r_uri for subsequent requests */
-	eol_line(8)=str_uri.len?str_uri:empty_param;
+	eol_line(8,str_uri.len?str_uri:empty_param);
 
-	eol_line(9)=get_from(msg)->body;		/* from */
-	eol_line(10)=msg->to->body;			/* to */
-	eol_line(11)=msg->callid->body;		/* callid */
-	eol_line(12)=get_from(msg)->tag_value;	/* from tag */
-	eol_line(13)=get_to(msg)->tag_value;	/* to tag */
-	eol_line(14)=get_cseq(msg)->number;	/* cseq number */
+	eol_line(9,get_from(msg)->body);		/* from */
+	eol_line(10,msg->to->body);			/* to */
+	eol_line(11,msg->callid->body);		/* callid */
+	eol_line(12,get_from(msg)->tag_value);	/* from tag */
+	eol_line(13,get_to(msg)->tag_value);	/* to tag */
+	eol_line(14,get_cseq(msg)->number);	/* cseq number */
 
-	eol_line(15).s=id_buf;       /* hash:label */
+	eol_line_s(15)=id_buf;       /* hash:label */
 	s = int2str(hash_index, &l);
 	if (l+1>=IDBUF_LEN) {
 		LOG(L_ERR, "assemble_msg: too big hash\n");
@@ -882,19 +887,19 @@ static int assemble_msg(struct sip_msg* msg, struct tw_info *twi)
 	}
 	memcpy(id_buf, s, l);
 	id_buf[l]=':';
-	eol_line(15).len=l+1;
+	eol_line_len(15)=l+1;
 	s = int2str(label, &l);
-	if (l+1+eol_line(15).len>=IDBUF_LEN) {
+	if (l+1+eol_line_len(15)>=IDBUF_LEN) {
 		LOG(L_ERR, "assemble_msg: too big label\n");
 		goto error;
 	}
-	memcpy(id_buf+eol_line(15).len, s, l);
-	eol_line(15).len+=l;
+	memcpy(id_buf+eol_line_len(15), s, l);
+	eol_line_len(15) += l;
 
-	eol_line(16) = route.len ? route : empty_param;
-	eol_line(17) = next_hop;
-	eol_line(18) = append;
-	eol_line(19) = body;
+	eol_line(16, route.len ? route : empty_param );
+	eol_line(17, next_hop );
+	eol_line(18, append );
+	eol_line(19, body );
 
 	/* success */
 	return 1;
@@ -947,7 +952,7 @@ static int write_to_unixsock(char* sockname, int cnt)
 		return -1;
 	}
 
-	if (tsend_dgram_ev(sock, (struct iovec*)lines_eol, 2 * cnt, tm_unix_tx_timeout * 1000) < 0) {
+	if (tsend_dgram_ev(sock, iov_lines_eol, 2 * cnt, tm_unix_tx_timeout * 1000) < 0) {
 		LOG(L_ERR, "write_to_unixsock: writev failed: %s\n", strerror(errno));
 		return -1;
 	}