Explorar o código

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 %!s(int64=20) %!d(string=hai) anos
pai
achega
ed477dbc0c
Modificáronse 1 ficheiros con 40 adicións e 35 borrados
  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;
 	}