/** change the max # of entries sparse matrix */ static SS_INT ss_sprealloc (cs *A, SS_INT nzmax) { SS_INT ok, oki, okj = 1, okx = 1 ; if (!A) return (0) ; if (nzmax <= 0) nzmax = (SS_CSC (A)) ? (A->p [A->n]) : A->nz ; A->i = ss_realloc (A->i, nzmax, sizeof (SS_INT), &oki) ; if (SS_TRIPLET (A)) A->p = ss_realloc (A->p, nzmax, sizeof (SS_INT), &okj) ; if (A->x) A->x = ss_realloc (A->x, nzmax, sizeof (SS_ENTRY), &okx) ; ok = (oki && okj && okx) ; if (ok) A->nzmax = nzmax ; return (ok) ; }
int brealloc(buffer_t *ptr, size_t len, size_t capacity) { if (ptr == NULL) return -1; size_t real_capacity = max(len, capacity); if (ptr->capacity < real_capacity) { ptr->array = ss_realloc(ptr->array, real_capacity); ptr->capacity = real_capacity; } return real_capacity; }
static void ssa_realloc(void) { ssa a; ss_aopen(&a, &ss_stda); void *buf = ss_malloc(&a, 123); t( buf != NULL ); buf = ss_realloc(&a, buf, 321); t( buf != NULL ); ss_free(&a, buf); ss_aclose(&a); }
static void dns_query_v6_cb(struct dns_ctx *ctx, struct dns_rr_a6 *result, void *data) { struct ResolvQuery *cb_data = (struct ResolvQuery *)data; if (result == NULL) { if (verbose) { LOGI("IPv6 resolv: %s", dns_strerror(dns_status(ctx))); } } else if (result->dnsa6_nrr > 0) { struct sockaddr **new_responses = ss_realloc(cb_data->responses, (cb_data->response_count + result->dnsa6_nrr) * sizeof(struct sockaddr *)); if (new_responses == NULL) { LOGE("Failed to allocate memory for additional DNS responses"); } else { cb_data->responses = new_responses; for (int i = 0; i < result->dnsa6_nrr; i++) { struct sockaddr_in6 *sa = ss_malloc(sizeof(struct sockaddr_in6)); memset(sa, 0, sizeof(struct sockaddr_in6)); sa->sin6_family = AF_INET6; sa->sin6_port = cb_data->port; sa->sin6_addr = result->dnsa6_addr[i]; cb_data->responses[cb_data->response_count] = (struct sockaddr *)sa; if (cb_data->responses[cb_data->response_count] == NULL) { LOGE( "Failed to allocate memory for DNS query result address"); } else { cb_data->response_count++; } } } } ss_free(result); cb_data->queries[1] = NULL; /* mark AAAA query as being completed */ /* Once all queries have completed, call client callback */ if (all_queries_are_null(cb_data)) { return process_client_callback(cb_data); } }
static void dns_query_v6_cb(void *arg, int status, int timeouts, struct hostent *he) { int i, n; struct resolv_query *query = (struct resolv_query *)arg; if (status == ARES_EDESTRUCTION) { return; } if (!he || status != ARES_SUCCESS) { if (verbose) { LOGI("failed to lookup v6 address %s", ares_strerror(status)); } goto CLEANUP; } if (verbose) { LOGI("found address name v6 address %s", he->h_name); } n = 0; while (he->h_addr_list[n]) n++; if (n > 0) { struct sockaddr **new_responses = ss_realloc(query->responses, (query->response_count + n) * sizeof(struct sockaddr *)); if (new_responses == NULL) { LOGE("failed to allocate memory for additional DNS responses"); } else { query->responses = new_responses; for (i = 0; i < n; i++) { struct sockaddr_in6 *sa = ss_malloc(sizeof(struct sockaddr_in6)); memset(sa, 0, sizeof(struct sockaddr_in6)); sa->sin6_family = AF_INET6; sa->sin6_port = query->port; memcpy(&sa->sin6_addr, he->h_addr_list[i], he->h_length); query->responses[query->response_count] = (struct sockaddr *)sa; if (query->responses[query->response_count] == NULL) { LOGE("failed to allocate memory for DNS query result address"); } else { query->response_count++; } } } } CLEANUP: query->requests[1] = 0; /* mark A query as being completed */ /* Once all requests have completed, call client callback */ if (all_requests_are_null(query)) { return process_client_callback(query); } }