/*
- * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
{
struct fd_lookup_st *fdlookup;
- fdlookup = OPENSSL_zalloc(sizeof *fdlookup);
- if (fdlookup == NULL)
+ if ((fdlookup = OPENSSL_zalloc(sizeof(*fdlookup))) == NULL) {
+ ASYNCerr(ASYNC_F_ASYNC_WAIT_CTX_SET_WAIT_FD, ERR_R_MALLOC_FAILURE);
return 0;
+ }
fdlookup->key = key;
fdlookup->fd = fd;
int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key)
{
- struct fd_lookup_st *curr;
+ struct fd_lookup_st *curr, *prev;
curr = ctx->fds;
+ prev = NULL;
while (curr != NULL) {
- if (curr->del) {
+ if (curr->del == 1) {
/* This one has been marked deleted already so do nothing */
+ prev = curr;
curr = curr->next;
continue;
}
if (curr->add == 1) {
if (ctx->fds == curr) {
ctx->fds = curr->next;
- }
- else {
- struct fd_lookup_st *prev = ctx->fds;
- while (prev->next != curr && prev->next != NULL) {
- prev = prev->next;
- }
- if (prev->next == NULL) {
- return 1;
- }
+ } else {
prev->next = curr->next;
}
- /*
- * The fd has just been added so it can't be used externally
- * and it is safe to call the cleanup function here
+ /* It is responsibility of the caller to cleanup before calling
+ * ASYNC_WAIT_CTX_clear_fd
*/
- if (curr->cleanup != NULL)
- curr->cleanup(ctx, curr->key, curr->fd, curr->custom_data);
OPENSSL_free(curr);
ctx->numadd--;
return 1;
ctx->numdel++;
return 1;
}
+ prev = curr;
curr = curr->next;
}
return 0;