aboutsummaryrefslogtreecommitdiff
path: root/src/util/network.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-02-21 12:41:11 +0000
committerChristian Grothoff <christian@grothoff.org>2015-02-21 12:41:11 +0000
commit4857e9233d6983790cdca5374b25c75dfdc35c17 (patch)
tree42a374fcecbf7a316656d61dab04889b830b5652 /src/util/network.c
parent91ea3844b6a4a30b2c5ee8992eede03a78c8f081 (diff)
downloadgnunet-4857e9233d6983790cdca5374b25c75dfdc35c17.tar.gz
gnunet-4857e9233d6983790cdca5374b25c75dfdc35c17.zip
be more careful with errno, so we can be sure it is not overwritten by 'free()' and the like
Diffstat (limited to 'src/util/network.c')
-rw-r--r--src/util/network.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/util/network.c b/src/util/network.c
index 0427e9c5c..dfc76f27f 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -315,6 +315,8 @@ initialize_network_handle (struct GNUNET_NETWORK_Handle *h,
315 int af, 315 int af,
316 int type) 316 int type)
317{ 317{
318 int eno;
319
318 h->af = af; 320 h->af = af;
319 h->type = type; 321 h->type = type;
320 if (h->fd == INVALID_SOCKET) 322 if (h->fd == INVALID_SOCKET)
@@ -322,7 +324,9 @@ initialize_network_handle (struct GNUNET_NETWORK_Handle *h,
322#ifdef MINGW 324#ifdef MINGW
323 SetErrnoFromWinsockError (WSAGetLastError ()); 325 SetErrnoFromWinsockError (WSAGetLastError ());
324#endif 326#endif
327 eno = errno;
325 GNUNET_free (h); 328 GNUNET_free (h);
329 errno = eno;
326 return GNUNET_SYSERR; 330 return GNUNET_SYSERR;
327 } 331 }
328#ifndef MINGW 332#ifndef MINGW
@@ -339,8 +343,10 @@ initialize_network_handle (struct GNUNET_NETWORK_Handle *h,
339 343
340 if (GNUNET_SYSERR == GNUNET_NETWORK_socket_set_blocking (h, GNUNET_NO)) 344 if (GNUNET_SYSERR == GNUNET_NETWORK_socket_set_blocking (h, GNUNET_NO))
341 { 345 {
346 eno = errno;
342 GNUNET_break (0); 347 GNUNET_break (0);
343 GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (h)); 348 GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (h));
349 errno = eno;
344 return GNUNET_SYSERR; 350 return GNUNET_SYSERR;
345 } 351 }
346#ifdef DARWIN 352#ifdef DARWIN
@@ -370,6 +376,7 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
370 socklen_t *address_len) 376 socklen_t *address_len)
371{ 377{
372 struct GNUNET_NETWORK_Handle *ret; 378 struct GNUNET_NETWORK_Handle *ret;
379 int eno;
373 380
374 ret = GNUNET_new (struct GNUNET_NETWORK_Handle); 381 ret = GNUNET_new (struct GNUNET_NETWORK_Handle);
375#if DEBUG_NETWORK 382#if DEBUG_NETWORK
@@ -381,7 +388,7 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
381 (struct sockaddr *) &name, 388 (struct sockaddr *) &name,
382 &namelen); 389 &namelen);
383 390
384 if (gsn == 0) 391 if (0 == gsn)
385 LOG (GNUNET_ERROR_TYPE_DEBUG, 392 LOG (GNUNET_ERROR_TYPE_DEBUG,
386 "Accepting connection on `%s'\n", 393 "Accepting connection on `%s'\n",
387 GNUNET_a2s ((const struct sockaddr *) &name, 394 GNUNET_a2s ((const struct sockaddr *) &name,
@@ -393,14 +400,19 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
393 address_len); 400 address_len);
394 if (-1 == ret->fd) 401 if (-1 == ret->fd)
395 { 402 {
403 eno = errno;
396 GNUNET_free (ret); 404 GNUNET_free (ret);
405 errno = eno;
397 return NULL; 406 return NULL;
398 } 407 }
399 if (GNUNET_OK != 408 if (GNUNET_OK !=
400 initialize_network_handle (ret, 409 initialize_network_handle (ret,
401 (NULL != address) ? address->sa_family : desc->af, 410 (NULL != address) ? address->sa_family : desc->af,
402 SOCK_STREAM)) 411 SOCK_STREAM))
412 {
413
403 return NULL; 414 return NULL;
415 }
404 return ret; 416 return ret;
405} 417}
406 418