/** * Cleanup routine set up by atexit */ void cleanup(void) { int i; closesocket(sock); for (i = 0; i < destcount; i++) { if (keytype != KEY_NONE) { if (destlist[i].encinfo) { if (destlist[i].encinfo->pubkey.key) { if ((keyextype == KEYEX_RSA) || (keyextype == KEYEX_ECDH_RSA)) { free_RSA_key(destlist[i].encinfo->pubkey.rsa); } else { free_EC_key(destlist[i].encinfo->pubkey.ec); } if ((keyextype == KEYEX_ECDH_RSA) || (keyextype == KEYEX_ECDH_ECDSA)) { free_EC_key(destlist[i].encinfo->dhkey.ec); } } free(destlist[i].encinfo); } } } if (keytype != KEY_NONE) { if ((keyextype == KEYEX_RSA) || (keyextype == KEYEX_ECDH_RSA)) { free_RSA_key(privkey.rsa); } else { free_EC_key(privkey.ec); } if ((keyextype == KEYEX_ECDH_RSA) || (keyextype == KEYEX_ECDH_ECDSA)) { free_EC_key(dhkey.ec); } } crypto_cleanup(); if (status_file) { fclose(status_file); } #ifdef WINDOWS WSACleanup(); #endif }
/** * Clean up a group list entry. Free malloc'ed structures, drop the * multicast group (if no one else is using it) and free the slot. */ void group_cleanup(struct pr_group_list_t *group) { int i; for (i = 0; i < MAX_PEND; i++) { free(group->pending[i].naklist); } if (!addr_blank(&group->privatemcast) && (proxy_type != CLIENT_PROXY) && !other_mcast_users(group) && group->multi_join) { multicast_leave(listener, group->group_id, &group->privatemcast, m_interface, interface_count, server_fp, server_fp_count); } if (group->server_pubkey.key) { if ((group->keyextype == KEYEX_RSA) || (group->keyextype == KEYEX_ECDH_RSA)) { free_RSA_key(group->server_pubkey.rsa); } else { free_EC_key(group->server_pubkey.ec); } if ((group->keyextype == KEYEX_ECDH_RSA) || (group->keyextype == KEYEX_ECDH_ECDSA)) { free_EC_key(group->server_dhkey.ec); free_EC_key(group->proxy_dhkey.ec); } } for (i = 0; i < group->destcount; i++) { if (group->destinfo[i].pubkey.key) { if ((group->keyextype == KEYEX_RSA) || (group->keyextype == KEYEX_ECDH_RSA)) { free_RSA_key(group->destinfo[i].pubkey.rsa); } else { free_EC_key(group->destinfo[i].pubkey.ec); } if ((group->keyextype == KEYEX_ECDH_RSA) || (group->keyextype == KEYEX_ECDH_ECDSA)) { free_EC_key(group->destinfo[i].dhkey.ec); } } } memset(group, 0, sizeof(struct pr_group_list_t)); }
/** * Cleanup routine set up by atexit */ void cleanup(void) { int i; for (i = 0; i < MAXLIST; i++) { if (group_list[i].group_id != 0) { send_abort(&group_list[i], "Client shutting down"); file_cleanup(&group_list[i], 1); } } if (!parent) { for (i = 0; i < pub_multi_count; i++) { if (server_count > 0) { multicast_leave(listener, 0, &pub_multi[i], m_interface, interface_count, server_keys, server_count); if (has_proxy) { multicast_leave(listener, 0, &pub_multi[i], m_interface, interface_count, &proxy_info, 1); } } else { multicast_leave(listener, 0, &pub_multi[i], m_interface, interface_count, NULL, 0); } } } closesocket(listener); for (i = 0; i < key_count; i++) { if (privkey_type[i] == KEYBLOB_RSA) { free_RSA_key(privkey[i].rsa); } else { free_EC_key(privkey[i].ec); } } crypto_cleanup(); #ifdef WINDOWS WSACleanup(); #endif close_log(); }
/** * Clean up a group list entry. Close the file if open, * free malloc'ed structures, drop the multicast group * (if no one else is using it) and free the slot. */ void file_cleanup(struct group_list_t *group, int abort_session) { if (group->fileinfo.fd >= 0) { glog2(group, "starting file close"); close(group->fileinfo.fd); glog2(group, "done file close"); group->fileinfo.fd = -1; if (abort_session && !strcmp(tempdir, "")) { if (tempfile) { unlink(group->fileinfo.temppath); } else { unlink(group->fileinfo.filepath); } } else { if (tempfile) { move_to_backup(group); if (rename(group->fileinfo.temppath, group->fileinfo.filepath) == -1) { gsyserror(group, "Couldn't rename from %s to %s", group->fileinfo.temppath,group->fileinfo.filepath); } } if (group->fileinfo.tstamp) { utim_buf utbuf; utbuf.actime = group->fileinfo.tstamp; utbuf.modtime = group->fileinfo.tstamp; if (utime(group->fileinfo.filepath, &utbuf) == -1) { gsyserror(group, "utime failed"); } } } } if (abort_session || (group->file_id == 0)) { if (!addr_blank(&group->multi) && !other_mcast_users(group) && group->multi_join) { if (server_count > 0) { multicast_leave(listener, group->group_id, &group->multi, m_interface, interface_count, server_keys,server_count); if (has_proxy) { multicast_leave(listener, group->group_id, &group->multi, m_interface, interface_count, &proxy_info, 1); } } else { multicast_leave(listener, group->group_id, &group->multi, m_interface, interface_count, NULL, 0); } } if (group->server_pubkey.key) { if (group->keyextype == KEYEX_ECDH_ECDSA) { free_EC_key(group->server_pubkey.ec); } else { free_RSA_key(group->server_pubkey.rsa); } } if (group->server_dhkey.key) { free_EC_key(group->server_dhkey.ec); free_EC_key(group->client_dhkey.ec); } if (group->restartinfo && (strcmp(group->restartinfo->name, ""))) { // We have unused restart info from the last run. // Chalk this up as a loss and delete the data file char filepath[MAXPATHNAME]; snprintf(filepath, sizeof(filepath), "%s%c_group_%08X%c%s", tempdir, PATH_SEP, group->group_id, PATH_SEP, group->restartinfo->name); unlink(filepath); } if (abort_session) { write_restart_file(group); } free(group->loss_history); free(group->fileinfo.naklist); free(group->fileinfo.section_done); free(group->fileinfo.cache); free(group->fileinfo.cache_status); if (group->restartinfo) { free(group->restartinfo->naklist); free(group->restartinfo->section_done); free(group->restartinfo); } memset(group, 0, sizeof(struct group_list_t)); } else { // Don't clear the file_id in case we need to respond to late DONEs if (!strcmp(tempdir, "")) { run_postreceive(group, group->fileinfo.filepath); } group->phase = PHASE_MIDGROUP; set_timeout(group, 0); free(group->fileinfo.naklist); free(group->fileinfo.section_done); free(group->fileinfo.cache); free(group->fileinfo.cache_status); group->fileinfo.naklist = NULL; group->fileinfo.section_done = NULL; group->fileinfo.cache = NULL; group->fileinfo.cache_status = NULL; } }