diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-02-21 12:41:11 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-02-21 12:41:11 +0000 |
commit | 4857e9233d6983790cdca5374b25c75dfdc35c17 (patch) | |
tree | 42a374fcecbf7a316656d61dab04889b830b5652 /src/util/network.c | |
parent | 91ea3844b6a4a30b2c5ee8992eede03a78c8f081 (diff) | |
download | gnunet-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.c | 14 |
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 | ||