Hi,
I have found a bug in udpr-negotiate.c resulting in a segmentation fault on my platform. I'm not sure if this list is the right place for bug reports and patches but I give it a try.
In function startReceiver the struct client_config is allocated on the stack. A pointer to this struct is later set globally (global_client_config). The problem with this is that the struct is freed as the function returns. client_config should initially have been allocated on the heap and not on the stack to allow this behavior.
Regards Johan
A patch could look like this:
# diff udpcast-20060208/udpr-negotiate.c udpcast-modified/udpr-negotiate.c 84c84 < struct client_config client_config; ---
struct client_config *client_config;
92c92,94 < client_config.sender_is_newgen = 0; ---
client_config = MALLOC(struct client_config); client_config->sender_is_newgen = 0;
113c115 < zeroSockArray(client_config.socks, NR_CLIENT_SOCKS); ---
zeroSockArray(client_config->socks, NR_CLIENT_SOCKS);
115c117 < client_config.S_UCAST = makeSocket(ADDR_TYPE_UCAST, ---
client_config->S_UCAST = makeSocket(ADDR_TYPE_UCAST,
118c120 < client_config.S_BCAST = makeSocket(ADDR_TYPE_BCAST, ---
client_config->S_BCAST = makeSocket(ADDR_TYPE_BCAST,
126c128 < setSocketToBroadcast(client_config.S_UCAST); ---
setSocketToBroadcast(client_config->S_UCAST);
132c134 < setMcastDestination(client_config.S_UCAST, net_config->net_if, ---
setMcastDestination(client_config->S_UCAST, net_config->net_if,
134c136 < setTtl(client_config.S_UCAST, net_config->ttl); ---
setTtl(client_config->S_UCAST, net_config->ttl);
136c138 < client_config.S_MCAST_CTRL = ---
client_config->S_MCAST_CTRL =
148c150 < printMyIp(net_config->net_if, client_config.S_UCAST); ---
printMyIp(net_config->net_if, client_config->S_UCAST);
154c156 < client_config.clientNumber= 0; /*default number for asynchronous transfer*/ ---
client_config->clientNumber= 0; /*default number for asynchronous
transfer*/
161c163 < if (sendConnectReq(&client_config, net_config, ---
if (sendConnectReq(client_config, net_config,
171c173 < sock = udpc_selectSock(client_config.socks, NR_CLIENT_SOCKS); ---
sock = udpc_selectSock(client_config->socks, NR_CLIENT_SOCKS);
175c177 < Msg, client_config.serverAddr, net_config->portBase); ---
Msg, client_config->serverAddr, net_config->portBase);
181c183 < if(getPort(&client_config.serverAddr) != ---
if(getPort(&client_config->serverAddr) !=
188c190 < client_config.clientNumber = ntohl(Msg.connectReply.clNr); ---
client_config->clientNumber = ntohl(Msg.connectReply.clNr);
194c196 < client_config.sender_is_newgen = 1; ---
client_config->sender_is_newgen = 1;
198c200 < if (client_config.clientNumber == -1) { ---
if (client_config->clientNumber == -1) {
207c209 < client_config.sender_is_newgen = 1; ---
client_config->sender_is_newgen = 1;
232,233c234,235 < client_config.clientNumber, < getIpString(&client_config.serverAddr, ipBuffer)); ---
client_config->clientNumber, getIpString(&client_config->serverAddr, ipBuffer));
241c243 < client_config.S_MCAST_DATA = ---
client_config->S_MCAST_DATA =
251,252c253,254 < if(client_config.socks[i] != -1) < setRcvBuf(client_config.socks[i],net_config->requestedBufSize); ---
if(client_config->socks[i] != -1) setRcvBuf(client_config->socks[i],net_config->requestedBufSize);
258c260 < global_client_config= &client_config; ---
global_client_config= client_config;
268c270 < client_config.isStarted = 0; ---
client_config->isStarted = 0;
272c274 < client_config.console = NULL; ---
client_config->console = NULL;
276c278 < client_config.console = prepareConsole(0); ---
client_config->console = prepareConsole(0);
280c282 < spawnNetReceiver(&fifo,&client_config, net_config, stats); ---
spawnNetReceiver(&fifo,client_config, net_config, stats);
285c287 < pthread_join(client_config.thread, NULL); ---
pthread_join(client_config->thread, NULL);