Fix missing error handling of memory allocation (#1020)
* libopensc: handle allocation errors * handle more faults during memory allocation fixes several situations that cause segmentation fault
This commit is contained in:
parent
741add2588
commit
6bfb39454b
|
@ -50,6 +50,9 @@ C_LoadModule(const char *mspec, CK_FUNCTION_LIST_PTR_PTR funcs)
|
|||
sc_pkcs11_module_t *mod;
|
||||
CK_RV rv, (*c_get_function_list)(CK_FUNCTION_LIST_PTR_PTR);
|
||||
mod = calloc(1, sizeof(*mod));
|
||||
if (mod == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
mod->_magic = MAGIC;
|
||||
|
||||
if (mspec == NULL) {
|
||||
|
|
|
@ -229,7 +229,11 @@ static simclist_inline long get_random() {
|
|||
|
||||
/* list initialization */
|
||||
int list_init(list_t *simclist_restrict l) {
|
||||
if (l == NULL) return -1;
|
||||
if (l == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(l, 0, sizeof *l);
|
||||
|
||||
seed_random();
|
||||
|
||||
|
@ -238,6 +242,9 @@ int list_init(list_t *simclist_restrict l) {
|
|||
/* head/tail sentinels and mid pointer */
|
||||
l->head_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
|
||||
l->tail_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
|
||||
if (l->tail_sentinel == NULL || l->head_sentinel == NULL) {
|
||||
return -1;
|
||||
}
|
||||
l->head_sentinel->next = l->tail_sentinel;
|
||||
l->tail_sentinel->prev = l->head_sentinel;
|
||||
l->head_sentinel->prev = l->tail_sentinel->next = l->mid = NULL;
|
||||
|
@ -249,14 +256,19 @@ int list_init(list_t *simclist_restrict l) {
|
|||
l->iter_curentry = NULL;
|
||||
|
||||
/* free-list attributes */
|
||||
l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * sizeof(struct list_entry_s *));
|
||||
l->spareelsnum = 0;
|
||||
l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * sizeof(struct list_entry_s *));
|
||||
if (l->spareels == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef SIMCLIST_WITH_THREADS
|
||||
l->threadcount = 0;
|
||||
#endif
|
||||
|
||||
list_attributes_setdefaults(l);
|
||||
if (0 != list_attributes_setdefaults(l)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
assert(list_repOk(l));
|
||||
assert(list_attrOk(l));
|
||||
|
@ -402,6 +414,8 @@ static simclist_inline struct list_entry_s *list_findpos(const list_t *simclist_
|
|||
float x;
|
||||
int i;
|
||||
|
||||
if (l->head_sentinel == NULL || l->tail_sentinel == NULL) return NULL;
|
||||
|
||||
/* accept 1 slot overflow for fetching head and tail sentinels */
|
||||
if (posstart < -1 || posstart > (int)l->numels) return NULL;
|
||||
|
||||
|
@ -430,6 +444,9 @@ void *list_extract_at(list_t *simclist_restrict l, unsigned int pos) {
|
|||
if (l->iter_active || pos >= l->numels) return NULL;
|
||||
|
||||
tmp = list_findpos(l, pos);
|
||||
if (tmp == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
data = tmp->data;
|
||||
|
||||
tmp->data = NULL; /* save data from list_drop_elem() free() */
|
||||
|
@ -452,14 +469,18 @@ int list_insert_at(list_t *simclist_restrict l, const void *data, unsigned int p
|
|||
l->spareelsnum--;
|
||||
} else {
|
||||
lent = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
|
||||
if (lent == NULL)
|
||||
if (lent == NULL) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (l->attrs.copy_data) {
|
||||
/* make room for user' data (has to be copied) */
|
||||
size_t datalen = l->attrs.meter(data);
|
||||
lent->data = (struct list_entry_s *)malloc(datalen);
|
||||
if (lent->data == NULL) {
|
||||
return -1;
|
||||
}
|
||||
memcpy(lent->data, data, datalen);
|
||||
} else {
|
||||
lent->data = (void*)data;
|
||||
|
@ -467,6 +488,9 @@ int list_insert_at(list_t *simclist_restrict l, const void *data, unsigned int p
|
|||
|
||||
/* actually append element */
|
||||
prec = list_findpos(l, pos-1);
|
||||
if (prec == NULL) {
|
||||
return -1;
|
||||
}
|
||||
succ = prec->next;
|
||||
|
||||
prec->next = lent;
|
||||
|
@ -533,6 +557,9 @@ int list_delete_range(list_t *simclist_restrict l, unsigned int posstart, unsign
|
|||
if (l->iter_active || posend < posstart || posend >= l->numels) return -1;
|
||||
|
||||
tmp = list_findpos(l, posstart); /* first el to be deleted */
|
||||
if (tmp == NULL) {
|
||||
return -1;
|
||||
}
|
||||
lastvalid = tmp->prev; /* last valid element */
|
||||
|
||||
numdel = posend - posstart + 1;
|
||||
|
@ -591,34 +618,36 @@ int list_clear(list_t *simclist_restrict l) {
|
|||
|
||||
if (l->iter_active) return -1;
|
||||
|
||||
if (l->attrs.copy_data) { /* also free user data */
|
||||
/* spare a loop conditional with two loops: spareing elems and freeing elems */
|
||||
for (s = l->head_sentinel->next; l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS && s != l->tail_sentinel; s = s->next) {
|
||||
/* move elements as spares as long as there is room */
|
||||
if (s->data != NULL) free(s->data);
|
||||
l->spareels[l->spareelsnum++] = s;
|
||||
if (l->head_sentinel && l->tail_sentinel) {
|
||||
if (l->attrs.copy_data) { /* also free user data */
|
||||
/* spare a loop conditional with two loops: spareing elems and freeing elems */
|
||||
for (s = l->head_sentinel->next; l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS && s != l->tail_sentinel; s = s->next) {
|
||||
/* move elements as spares as long as there is room */
|
||||
if (s->data != NULL) free(s->data);
|
||||
l->spareels[l->spareelsnum++] = s;
|
||||
}
|
||||
while (s != l->tail_sentinel) {
|
||||
/* free the remaining elems */
|
||||
if (s->data != NULL) free(s->data);
|
||||
s = s->next;
|
||||
free(s->prev);
|
||||
}
|
||||
l->head_sentinel->next = l->tail_sentinel;
|
||||
l->tail_sentinel->prev = l->head_sentinel;
|
||||
} else { /* only free element containers */
|
||||
/* spare a loop conditional with two loops: spareing elems and freeing elems */
|
||||
for (s = l->head_sentinel->next; l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS && s != l->tail_sentinel; s = s->next) {
|
||||
/* move elements as spares as long as there is room */
|
||||
l->spareels[l->spareelsnum++] = s;
|
||||
}
|
||||
while (s != l->tail_sentinel) {
|
||||
/* free the remaining elems */
|
||||
s = s->next;
|
||||
free(s->prev);
|
||||
}
|
||||
l->head_sentinel->next = l->tail_sentinel;
|
||||
l->tail_sentinel->prev = l->head_sentinel;
|
||||
}
|
||||
while (s != l->tail_sentinel) {
|
||||
/* free the remaining elems */
|
||||
if (s->data != NULL) free(s->data);
|
||||
s = s->next;
|
||||
free(s->prev);
|
||||
}
|
||||
l->head_sentinel->next = l->tail_sentinel;
|
||||
l->tail_sentinel->prev = l->head_sentinel;
|
||||
} else { /* only free element containers */
|
||||
/* spare a loop conditional with two loops: spareing elems and freeing elems */
|
||||
for (s = l->head_sentinel->next; l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS && s != l->tail_sentinel; s = s->next) {
|
||||
/* move elements as spares as long as there is room */
|
||||
l->spareels[l->spareelsnum++] = s;
|
||||
}
|
||||
while (s != l->tail_sentinel) {
|
||||
/* free the remaining elems */
|
||||
s = s->next;
|
||||
free(s->prev);
|
||||
}
|
||||
l->head_sentinel->next = l->tail_sentinel;
|
||||
l->tail_sentinel->prev = l->head_sentinel;
|
||||
}
|
||||
l->numels = 0;
|
||||
l->mid = NULL;
|
||||
|
@ -640,6 +669,8 @@ int list_locate(const list_t *simclist_restrict l, const void *data) {
|
|||
struct list_entry_s *el;
|
||||
int pos = 0;
|
||||
|
||||
if (l->head_sentinel == NULL || l->tail_sentinel == NULL) return -1;
|
||||
|
||||
if (l->attrs.comparator != NULL) {
|
||||
/* use comparator */
|
||||
for (el = l->head_sentinel->next; el != l->tail_sentinel; el = el->next, pos++) {
|
||||
|
@ -661,6 +692,8 @@ void *list_seek(list_t *simclist_restrict l, const void *indicator) {
|
|||
|
||||
if (l->attrs.seeker == NULL) return NULL;
|
||||
|
||||
if (l->head_sentinel == NULL || l->tail_sentinel == NULL) return NULL;
|
||||
|
||||
for (iter = l->head_sentinel->next; iter != l->tail_sentinel; iter = iter->next) {
|
||||
if (l->attrs.seeker(iter->data, indicator) != 0) return iter->data;
|
||||
}
|
||||
|
@ -677,11 +710,15 @@ int list_concat(const list_t *l1, const list_t *l2, list_t *simclist_restrict de
|
|||
unsigned int cnt;
|
||||
int err;
|
||||
|
||||
|
||||
if (l1 == NULL || l2 == NULL || dest == NULL || l1 == dest || l2 == dest)
|
||||
return -1;
|
||||
|
||||
list_init(dest);
|
||||
if (l1->head_sentinel == NULL || l1->tail_sentinel == NULL
|
||||
|| l2->head_sentinel == NULL || l2->tail_sentinel == NULL) return -1;
|
||||
|
||||
if (0 != list_init(dest)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
dest->numels = l1->numels + l2->numels;
|
||||
if (dest->numels == 0)
|
||||
|
@ -692,6 +729,9 @@ int list_concat(const list_t *l1, const list_t *l2, list_t *simclist_restrict de
|
|||
el = dest->head_sentinel;
|
||||
while (srcel != l1->tail_sentinel) {
|
||||
el->next = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
|
||||
if (el->next == NULL) {
|
||||
return -1;
|
||||
}
|
||||
el->next->prev = el;
|
||||
el = el->next;
|
||||
el->data = srcel->data;
|
||||
|
@ -702,6 +742,9 @@ int list_concat(const list_t *l1, const list_t *l2, list_t *simclist_restrict de
|
|||
srcel = l2->head_sentinel->next;
|
||||
while (srcel != l2->tail_sentinel) {
|
||||
el->next = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
|
||||
if (el->next == NULL) {
|
||||
return -1;
|
||||
}
|
||||
el->next->prev = el;
|
||||
el = el->next;
|
||||
el->data = srcel->data;
|
||||
|
@ -731,6 +774,9 @@ int list_sort(list_t *simclist_restrict l, int versus) {
|
|||
|
||||
if (l->numels <= 1)
|
||||
return 0;
|
||||
|
||||
if (l->head_sentinel == NULL || l->tail_sentinel == NULL) return -1;
|
||||
|
||||
list_sort_quicksort(l, versus, 0, l->head_sentinel->next, l->numels-1, l->tail_sentinel->prev);
|
||||
assert(list_repOk(l));
|
||||
return 0;
|
||||
|
@ -869,6 +915,9 @@ static void list_sort_quicksort(list_t *simclist_restrict l, int versus,
|
|||
/* prepare wrapped args, then start thread */
|
||||
if (l->threadcount < SIMCLIST_MAXTHREADS-1) {
|
||||
struct list_sort_wrappedparams *wp = (struct list_sort_wrappedparams *)malloc(sizeof(struct list_sort_wrappedparams));
|
||||
if (wp == NULL) {
|
||||
return -1;
|
||||
}
|
||||
l->threadcount++;
|
||||
traised = 1;
|
||||
wp->l = l;
|
||||
|
@ -899,6 +948,7 @@ static void list_sort_quicksort(list_t *simclist_restrict l, int versus,
|
|||
|
||||
int list_iterator_start(list_t *simclist_restrict l) {
|
||||
if (l->iter_active) return 0;
|
||||
if (l->head_sentinel == NULL) return -1;
|
||||
l->iter_pos = 0;
|
||||
l->iter_active = 1;
|
||||
l->iter_curentry = l->head_sentinel->next;
|
||||
|
@ -1247,6 +1297,9 @@ int list_restore_filedescriptor(list_t *simclist_restrict l, int fd, size_t *sim
|
|||
if (l->attrs.unserializer != NULL) {
|
||||
/* use unserializer */
|
||||
buf = malloc(header.elemlen);
|
||||
if (buf == NULL) {
|
||||
return -1;
|
||||
}
|
||||
for (cnt = 0; cnt < header.numels; cnt++) {
|
||||
READ_ERRCHECK(fd, buf, header.elemlen);
|
||||
list_append(l, l->attrs.unserializer(buf, & elsize));
|
||||
|
@ -1256,6 +1309,9 @@ int list_restore_filedescriptor(list_t *simclist_restrict l, int fd, size_t *sim
|
|||
/* copy verbatim into memory */
|
||||
for (cnt = 0; cnt < header.numels; cnt++) {
|
||||
buf = malloc(header.elemlen);
|
||||
if (buf == NULL) {
|
||||
return -1;
|
||||
}
|
||||
READ_ERRCHECK(fd, buf, header.elemlen);
|
||||
list_append(l, buf);
|
||||
}
|
||||
|
@ -1269,6 +1325,9 @@ int list_restore_filedescriptor(list_t *simclist_restrict l, int fd, size_t *sim
|
|||
for (cnt = 0; cnt < header.numels; cnt++) {
|
||||
READ_ERRCHECK(fd, & elsize, sizeof(elsize));
|
||||
buf = malloc((size_t)elsize);
|
||||
if (buf == NULL) {
|
||||
return -1;
|
||||
}
|
||||
READ_ERRCHECK(fd, buf, elsize);
|
||||
totreadlen += elsize;
|
||||
list_append(l, l->attrs.unserializer(buf, & elsize));
|
||||
|
@ -1279,6 +1338,9 @@ int list_restore_filedescriptor(list_t *simclist_restrict l, int fd, size_t *sim
|
|||
for (cnt = 0; cnt < header.numels; cnt++) {
|
||||
READ_ERRCHECK(fd, & elsize, sizeof(elsize));
|
||||
buf = malloc(elsize);
|
||||
if (buf == NULL) {
|
||||
return -1;
|
||||
}
|
||||
READ_ERRCHECK(fd, buf, elsize);
|
||||
totreadlen += elsize;
|
||||
list_append(l, buf);
|
||||
|
@ -1368,7 +1430,7 @@ static int list_drop_elem(list_t *simclist_restrict l, struct list_entry_s *tmp,
|
|||
if (l->attrs.copy_data && tmp->data != NULL)
|
||||
free(tmp->data);
|
||||
|
||||
if (l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS) {
|
||||
if (l->spareels != NULL && l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS) {
|
||||
l->spareels[l->spareelsnum++] = tmp;
|
||||
} else {
|
||||
free(tmp);
|
||||
|
|
|
@ -190,6 +190,8 @@ static cac_private_data_t *cac_new_private_data(void)
|
|||
{
|
||||
cac_private_data_t *priv;
|
||||
priv = calloc(1, sizeof(cac_private_data_t));
|
||||
if (!priv)
|
||||
return NULL;
|
||||
list_init(&priv->pki_list);
|
||||
list_attributes_comparator(&priv->pki_list, cac_list_compare_path);
|
||||
list_attributes_copy(&priv->pki_list, cac_list_meter, 1);
|
||||
|
@ -1453,6 +1455,8 @@ static int cac_find_and_initialize(sc_card_t *card, int initialize)
|
|||
return r;
|
||||
|
||||
priv = cac_new_private_data();
|
||||
if (!priv)
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
r = cac_process_CCC(card, priv);
|
||||
if (r == SC_SUCCESS) {
|
||||
card->type = SC_CARD_TYPE_CAC_II;
|
||||
|
@ -1470,6 +1474,8 @@ static int cac_find_and_initialize(sc_card_t *card, int initialize)
|
|||
|
||||
if (!priv) {
|
||||
priv = cac_new_private_data();
|
||||
if (!priv)
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
r = cac_populate_cac_1(card, index, priv);
|
||||
if (r == SC_SUCCESS) {
|
||||
|
|
|
@ -788,6 +788,8 @@ static coolkey_private_data_t *coolkey_new_private_data(void)
|
|||
coolkey_private_data_t *priv;
|
||||
/* allocate priv and zero all the fields */
|
||||
priv = calloc(1, sizeof(coolkey_private_data_t));
|
||||
if (!priv)
|
||||
return NULL;
|
||||
/* set other fields as appropriate */
|
||||
priv->key_id = COOLKEY_INVALID_KEY;
|
||||
list_init(&priv->objects_list);
|
||||
|
@ -2152,7 +2154,7 @@ static int coolkey_initialize(sc_card_t *card)
|
|||
|
||||
priv = coolkey_new_private_data();
|
||||
if (priv == NULL) {
|
||||
r= SC_ERROR_OUT_OF_MEMORY;
|
||||
r = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
r = coolkey_get_life_cycle(card, &life_cycle);
|
||||
|
|
|
@ -422,9 +422,8 @@ static int dnie_get_environment(
|
|||
/* look for sc block in opensc.conf */
|
||||
ctx = card->ctx;
|
||||
for (i = 0; ctx->conf_blocks[i]; i++) {
|
||||
blocks =
|
||||
scconf_find_blocks(ctx->conf, ctx->conf_blocks[i],
|
||||
"card_driver", "dnie");
|
||||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[i],
|
||||
"card_driver", "dnie");
|
||||
if (!blocks)
|
||||
continue;
|
||||
blk = blocks[0];
|
||||
|
|
|
@ -387,8 +387,13 @@ static int entersafe_transmit_apdu(sc_card_t *card, sc_apdu_t *apdu,
|
|||
{
|
||||
mac_data_size=apdu->lc+4;
|
||||
mac_data=malloc(mac_data_size);
|
||||
if(!mac_data)
|
||||
{
|
||||
r = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
r = entersafe_mac_apdu(card,apdu,key,keylen,mac_data,mac_data_size);
|
||||
if(r<0)
|
||||
if(r < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ static int get_conf_aid(sc_card_t *card, u8 *aid, size_t *len)
|
|||
for (i = 0; ctx->conf_blocks[i] != NULL; i++) {
|
||||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[i],
|
||||
"card", "gemsafeV1");
|
||||
if (blocks[0] != NULL)
|
||||
if (blocks != NULL && blocks[0] != NULL)
|
||||
conf_block = blocks[0];
|
||||
free(blocks);
|
||||
}
|
||||
|
|
|
@ -208,6 +208,8 @@ static int itacns_init(sc_card_t *card)
|
|||
card->cla = 0x00;
|
||||
|
||||
card->drv_data = calloc(1, sizeof(itacns_drv_data_t));
|
||||
if (!card->drv_data)
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
/* Match ATR again to find the card data. */
|
||||
itacns_match_card(card);
|
||||
|
@ -219,7 +221,7 @@ static int itacns_init(sc_card_t *card)
|
|||
;
|
||||
_sc_card_add_rsa_alg(card, 1024, flags, 0);
|
||||
|
||||
return 0;
|
||||
return SC_SUCCESS;
|
||||
}
|
||||
|
||||
static int itacns_finish(struct sc_card *card)
|
||||
|
|
|
@ -371,6 +371,10 @@ static int npa_init(sc_card_t * card)
|
|||
EAC_init();
|
||||
#endif
|
||||
card->drv_data = npa_drv_data_create();
|
||||
if (!card->drv_data) {
|
||||
r = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto err;
|
||||
}
|
||||
r = npa_load_options(card->ctx, card->drv_data);
|
||||
if (r != SC_SUCCESS)
|
||||
goto err;
|
||||
|
|
|
@ -2122,6 +2122,10 @@ auth_read_binary(struct sc_card *card, unsigned int offset,
|
|||
{
|
||||
int rv;
|
||||
char debug_buf[2048];
|
||||
struct sc_pkcs15_bignum bn[2];
|
||||
unsigned char *out = NULL;
|
||||
bn[0].data = NULL;
|
||||
bn[1].data = NULL;
|
||||
|
||||
LOG_FUNC_CALLED(card->ctx);
|
||||
sc_log(card->ctx,
|
||||
|
@ -2136,9 +2140,8 @@ auth_read_binary(struct sc_card *card, unsigned int offset,
|
|||
if (auth_current_ef->magic==SC_FILE_MAGIC &&
|
||||
auth_current_ef->ef_structure == SC_CARDCTL_OBERTHUR_KEY_RSA_PUBLIC) {
|
||||
int jj;
|
||||
unsigned char resp[256], *out = NULL;
|
||||
unsigned char resp[256];
|
||||
size_t resp_len, out_len;
|
||||
struct sc_pkcs15_bignum bn[2];
|
||||
struct sc_pkcs15_pubkey_rsa key;
|
||||
|
||||
resp_len = sizeof(resp);
|
||||
|
@ -2150,14 +2153,22 @@ auth_read_binary(struct sc_card *card, unsigned int offset,
|
|||
;
|
||||
|
||||
bn[0].data = calloc(1, rv - jj);
|
||||
if (!bn[0].data) {
|
||||
rv = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto err;
|
||||
}
|
||||
bn[0].len = rv - jj;
|
||||
memcpy(bn[0].data, resp + jj, rv - jj);
|
||||
|
||||
rv = auth_read_component(card, SC_CARDCTL_OBERTHUR_KEY_RSA_PUBLIC,
|
||||
1, resp, resp_len);
|
||||
LOG_TEST_RET(card->ctx, rv, "Cannot read RSA public key component");
|
||||
LOG_TEST_GOTO_ERR(card->ctx, rv, "Cannot read RSA public key component");
|
||||
|
||||
bn[1].data = calloc(1, rv);
|
||||
if (!bn[1].data) {
|
||||
rv = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto err;
|
||||
}
|
||||
bn[1].len = rv;
|
||||
memcpy(bn[1].data, resp, rv);
|
||||
|
||||
|
@ -2165,8 +2176,8 @@ auth_read_binary(struct sc_card *card, unsigned int offset,
|
|||
key.modulus = bn[1];
|
||||
|
||||
if (sc_pkcs15_encode_pubkey_rsa(card->ctx, &key, &out, &out_len)) {
|
||||
LOG_TEST_RET(card->ctx, SC_ERROR_INVALID_ASN1_OBJECT,
|
||||
"cannot encode RSA public key");
|
||||
rv = SC_ERROR_INVALID_ASN1_OBJECT;
|
||||
LOG_TEST_GOTO_ERR(card->ctx, rv, "cannot encode RSA public key");
|
||||
}
|
||||
else {
|
||||
rv = out_len - offset > count ? count : out_len - offset;
|
||||
|
@ -2179,18 +2190,16 @@ auth_read_binary(struct sc_card *card, unsigned int offset,
|
|||
"write_publickey in %"SC_FORMAT_LEN_SIZE_T"u bytes :\n%s",
|
||||
count, debug_buf);
|
||||
}
|
||||
|
||||
if (bn[0].data)
|
||||
free(bn[0].data);
|
||||
if (bn[1].data)
|
||||
free(bn[1].data);
|
||||
if (out)
|
||||
free(out);
|
||||
}
|
||||
else {
|
||||
else {
|
||||
rv = iso_ops->read_binary(card, offset, buf, count, 0);
|
||||
}
|
||||
|
||||
err:
|
||||
free(bn[0].data);
|
||||
free(bn[1].data);
|
||||
free(out);
|
||||
|
||||
LOG_FUNC_RETURN(card->ctx, rv);
|
||||
}
|
||||
|
||||
|
|
|
@ -579,9 +579,6 @@ static int piv_general_io(sc_card_t *card, int ins, int p1, int p2,
|
|||
/* if using internal buffer, alloc new one */
|
||||
if (rbuf == rbufinitbuf) {
|
||||
*recvbuf = malloc(rbuflen);
|
||||
sc_log(card->ctx,
|
||||
"DEE got buffer %p len %"SC_FORMAT_LEN_SIZE_T"u",
|
||||
*recvbuf, rbuflen);
|
||||
if (*recvbuf == NULL) {
|
||||
r = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto err;
|
||||
|
|
|
@ -1414,12 +1414,12 @@ sc_card_sm_check(struct sc_card *card)
|
|||
for (ii = 0; ctx->conf_blocks[ii]; ii++) {
|
||||
scconf_block **blocks;
|
||||
|
||||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[ii], "secure_messaging", sm);
|
||||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[ii], "secure_messaging", sm);
|
||||
if (blocks) {
|
||||
sm_conf_block = blocks[0];
|
||||
free(blocks);
|
||||
}
|
||||
if (sm_conf_block != NULL)
|
||||
if (sm_conf_block != NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -670,12 +670,12 @@ static void process_config_file(sc_context_t *ctx, struct _sc_ctx_options *opts)
|
|||
return;
|
||||
}
|
||||
blocks = scconf_find_blocks(ctx->conf, NULL, "app", ctx->app_name);
|
||||
if (blocks[0])
|
||||
if (blocks && blocks[0])
|
||||
ctx->conf_blocks[count++] = blocks[0];
|
||||
free(blocks);
|
||||
if (strcmp(ctx->app_name, "default") != 0) {
|
||||
blocks = scconf_find_blocks(ctx->conf, NULL, "app", "default");
|
||||
if (blocks[0])
|
||||
if (blocks && blocks[0])
|
||||
ctx->conf_blocks[count] = blocks[0];
|
||||
free(blocks);
|
||||
}
|
||||
|
@ -775,7 +775,9 @@ int sc_context_create(sc_context_t **ctx_out, const sc_context_param_t *parm)
|
|||
ctx->flags = parm->flags;
|
||||
set_defaults(ctx, &opts);
|
||||
|
||||
list_init(&ctx->readers);
|
||||
if (0 != list_init(&ctx->readers)) {
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
list_attributes_seeker(&ctx->readers, reader_list_seeker);
|
||||
/* set thread context and create mutex object (if specified) */
|
||||
if (parm->thread_ctx != NULL)
|
||||
|
|
|
@ -225,6 +225,11 @@ static int sc_pkcs15emu_actalis_init(sc_pkcs15_card_t * p15card)
|
|||
compCert = malloc(compLen * sizeof(unsigned char));
|
||||
len = 3 * compLen; /*Approximation of the uncompressed size */
|
||||
cert = malloc(len * sizeof(unsigned char));
|
||||
if (!cert || !compCert) {
|
||||
free(cert);
|
||||
free(compCert);
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
sc_read_binary(card, 4, compCert, compLen, 0);
|
||||
|
||||
|
|
|
@ -373,6 +373,10 @@ static int sc_pkcs15emu_cac_init(sc_pkcs15_card_t *p15card)
|
|||
cert_out->subject_len, &cn_oid, &cn_name, &cn_len);
|
||||
if (r == SC_SUCCESS) {
|
||||
token_name = malloc (cn_len+1);
|
||||
if (!token_name) {
|
||||
r = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
memcpy(token_name, cn_name, cn_len);
|
||||
free(cn_name);
|
||||
token_name[cn_len] = 0;
|
||||
|
|
|
@ -380,6 +380,8 @@ coolkey_make_public_key(sc_card_t *card, sc_cardctl_coolkey_object_t *obj, CK_KE
|
|||
int r;
|
||||
|
||||
key = calloc(1, sizeof(struct sc_pkcs15_pubkey));
|
||||
if (!key)
|
||||
return NULL;
|
||||
switch (key_type) {
|
||||
case CKK_RSA:
|
||||
key->algorithm = SC_ALGORITHM_RSA;
|
||||
|
|
|
@ -519,6 +519,11 @@ static int loadCertificate(sc_pkcs15_card_t * p15card, int i,
|
|||
compCert = malloc(compLen * sizeof(unsigned char));
|
||||
len = 4 * compLen; /*Approximation of the uncompressed size */
|
||||
cert = malloc(len * sizeof(unsigned char));
|
||||
if (!cert || !compCert) {
|
||||
free(cert);
|
||||
free(compCert);
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
sc_read_binary(card, 4, compCert, compLen, 0);
|
||||
|
||||
|
|
|
@ -619,6 +619,8 @@ sc_pkcs15_convert_bignum(sc_pkcs15_bignum_t *dst, const void *src)
|
|||
return 0;
|
||||
dst->len = BN_num_bytes(bn);
|
||||
dst->data = malloc(dst->len);
|
||||
if (!dst->data)
|
||||
return 0;
|
||||
BN_bn2bin(bn, dst->data);
|
||||
return 1;
|
||||
#else
|
||||
|
@ -722,6 +724,8 @@ sc_pkcs15_convert_prkey(struct sc_pkcs15_prkey *pkcs15_key, void *evp_key)
|
|||
|
||||
/* copy the public key */
|
||||
dst->ecpointQ.value = malloc(buflen);
|
||||
if (!dst->ecpointQ.value)
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
memcpy(dst->ecpointQ.value, buf, buflen);
|
||||
dst->ecpointQ.len = buflen;
|
||||
|
||||
|
|
|
@ -1095,6 +1095,8 @@ sc_pkcs15_dup_pubkey(struct sc_context *ctx, struct sc_pkcs15_pubkey *key, struc
|
|||
rv = sc_asn1_encode_algorithm_id(ctx, &alg, &alglen,key->alg_id, 0);
|
||||
if (rv == SC_SUCCESS) {
|
||||
pubkey->alg_id = (struct sc_algorithm_id *)calloc(1, sizeof(struct sc_algorithm_id));
|
||||
if (pubkey->alg_id == NULL)
|
||||
LOG_FUNC_RETURN(ctx, SC_ERROR_OUT_OF_MEMORY);
|
||||
rv = sc_asn1_decode_algorithm_id(ctx, alg, alglen, pubkey->alg_id, 0);
|
||||
free(alg);
|
||||
}
|
||||
|
|
|
@ -1153,6 +1153,10 @@ sc_pkcs15_bind_internal(struct sc_pkcs15_card *p15card, struct sc_aid *aid)
|
|||
if (!p15card->tokeninfo->serial_number && card->serialnr.len) {
|
||||
char *serial = calloc(1, card->serialnr.len*2 + 1);
|
||||
size_t ii;
|
||||
if (!serial) {
|
||||
err = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto end;
|
||||
}
|
||||
|
||||
for(ii=0;ii<card->serialnr.len;ii++)
|
||||
sprintf(serial + ii*2, "%02X", *(card->serialnr.value + ii));
|
||||
|
|
|
@ -190,7 +190,7 @@ static int ctapi_transmit(sc_reader_t *reader, sc_apdu_t *apdu)
|
|||
int r;
|
||||
|
||||
rsize = rbuflen = apdu->resplen + 2;
|
||||
rbuf = malloc(rbuflen);
|
||||
rbuf = malloc(rbuflen);
|
||||
if (rbuf == NULL) {
|
||||
r = SC_ERROR_OUT_OF_MEMORY;
|
||||
goto out;
|
||||
|
@ -310,9 +310,14 @@ static struct ctapi_module * add_module(struct ctapi_global_private_data *gpriv,
|
|||
const char *name, void *dlhandle)
|
||||
{
|
||||
int i;
|
||||
struct ctapi_module *p;
|
||||
|
||||
i = gpriv->module_count;
|
||||
gpriv->modules = (struct ctapi_module *) realloc(gpriv->modules, sizeof(struct ctapi_module) * (i+1));
|
||||
p = (struct ctapi_module *) realloc(gpriv->modules, sizeof(struct ctapi_module) * (i+1));
|
||||
if (!p) {
|
||||
return NULL;
|
||||
}
|
||||
gpriv->modules = p;
|
||||
gpriv->modules[i].name = strdup(name);
|
||||
gpriv->modules[i].dlhandle = dlhandle;
|
||||
gpriv->modules[i].ctn_count = 0;
|
||||
|
@ -358,6 +363,8 @@ static int ctapi_load_module(sc_context_t *ctx,
|
|||
goto symerr;
|
||||
|
||||
mod = add_module(gpriv, val, dlh);
|
||||
if (!mod)
|
||||
goto symerr;
|
||||
for (; list != NULL; list = list->next) {
|
||||
int port;
|
||||
char namebuf[128];
|
||||
|
|
|
@ -115,9 +115,8 @@ openct_add_reader(sc_context_t *ctx, unsigned int num, ct_info_t *info)
|
|||
int rc;
|
||||
|
||||
if (!(reader = calloc(1, sizeof(*reader)))
|
||||
|| !(data = (calloc(1, sizeof(*data))))) {
|
||||
if (reader)
|
||||
free(reader);
|
||||
|| !(data = (calloc(1, sizeof(*data))))) {
|
||||
free(reader);
|
||||
return SC_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
|
|
|
@ -5694,6 +5694,8 @@ DWORD WINAPI CardAcquireContext(__inout PCARD_DATA pCardData, __in DWORD dwFlags
|
|||
|
||||
/* VENDOR SPECIFIC */
|
||||
vs = pCardData->pvVendorSpecific = pCardData->pfnCspAlloc(sizeof(VENDOR_SPECIFIC));
|
||||
if (!vs)
|
||||
return SCARD_E_NO_MEMORY;
|
||||
memset(vs, 0, sizeof(VENDOR_SPECIFIC));
|
||||
|
||||
logprintf(pCardData, 1, "==================================================================\n");
|
||||
|
|
|
@ -968,6 +968,9 @@ pkcs15_init_slot(struct sc_pkcs15_card *p15card, struct sc_pkcs11_slot *slot,
|
|||
slot->token_info.flags |= CKF_RNG;
|
||||
|
||||
slot->fw_data = fw_data = calloc(1, sizeof(*fw_data));
|
||||
if (!fw_data) {
|
||||
return;
|
||||
}
|
||||
fw_data->auth_obj = auth;
|
||||
|
||||
if (auth != NULL) {
|
||||
|
@ -2136,7 +2139,7 @@ pkcs15_create_secret_key(struct sc_pkcs11_slot *slot, struct sc_profile *profile
|
|||
if (attr->pValue) {
|
||||
args.data_value.value = calloc(1,attr->ulValueLen);
|
||||
if (!args.data_value.value)
|
||||
return CKR_HOST_MEMORY;
|
||||
return CKR_HOST_MEMORY;
|
||||
memcpy(args.data_value.value, attr->pValue, attr->ulValueLen);
|
||||
args.data_value.len = attr->ulValueLen;
|
||||
}
|
||||
|
@ -2170,8 +2173,8 @@ pkcs15_create_secret_key(struct sc_pkcs11_slot *slot, struct sc_profile *profile
|
|||
|
||||
key_obj = calloc(1, sizeof(sc_pkcs15_object_t));
|
||||
if (key_obj == NULL) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
key_obj->type = SC_PKCS15_TYPE_SKEY;
|
||||
|
||||
|
@ -2181,9 +2184,9 @@ pkcs15_create_secret_key(struct sc_pkcs11_slot *slot, struct sc_profile *profile
|
|||
key_obj->flags = 2; /* TODO not sure what these mean */
|
||||
|
||||
skey_info = calloc(1, sizeof(sc_pkcs15_skey_info_t));
|
||||
if (skey_info == NULL) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
if (skey_info == NULL) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
key_obj->data = skey_info;
|
||||
skey_info->usage = args.usage;
|
||||
|
|
|
@ -704,6 +704,10 @@ sc_pkcs11_verify_final(sc_pkcs11_operation_t *operation,
|
|||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
pubkey_value = calloc(1, attr.ulValueLen);
|
||||
if (!pubkey_value) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
attr.pValue = pubkey_value;
|
||||
rv = key->ops->get_attribute(operation->session, key, &attr);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -841,19 +845,19 @@ sc_pkcs11_deri(struct sc_pkcs11_session *session,
|
|||
|
||||
ulDataLen = 0;
|
||||
rv = operation->type->derive(operation, basekey,
|
||||
pMechanism->pParameter, pMechanism->ulParameterLen,
|
||||
NULL, &ulDataLen);
|
||||
pMechanism->pParameter, pMechanism->ulParameterLen,
|
||||
NULL, &ulDataLen);
|
||||
if (rv != CKR_OK)
|
||||
goto out;
|
||||
goto out;
|
||||
|
||||
if (ulDataLen > 0)
|
||||
keybuf = calloc(1,ulDataLen);
|
||||
keybuf = calloc(1,ulDataLen);
|
||||
else
|
||||
keybuf = calloc(1,8); /* pass in dummy buffer */
|
||||
keybuf = calloc(1,8); /* pass in dummy buffer */
|
||||
|
||||
if (!keybuf) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
if (!keybuf) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Now do the actuall derivation */
|
||||
|
|
|
@ -257,11 +257,18 @@ CK_RV C_Initialize(CK_VOID_PTR pInitArgs)
|
|||
load_pkcs11_parameters(&sc_pkcs11_conf, context);
|
||||
|
||||
/* List of sessions */
|
||||
list_init(&sessions);
|
||||
if (0 != list_init(&sessions)) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
list_attributes_seeker(&sessions, session_list_seeker);
|
||||
|
||||
/* List of slots */
|
||||
list_init(&virtual_slots);
|
||||
if (0 != list_init(&virtual_slots)) {
|
||||
rv = CKR_HOST_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
list_attributes_seeker(&virtual_slots, slot_list_seeker);
|
||||
|
||||
/* Create slots for readers found on initialization, only if in 2.11 mode */
|
||||
|
|
|
@ -95,10 +95,14 @@ CK_RV create_slot(sc_reader_t *reader)
|
|||
return CKR_HOST_MEMORY;
|
||||
|
||||
list_append(&virtual_slots, slot);
|
||||
list_init(&slot->objects);
|
||||
if (0 != list_init(&slot->objects)) {
|
||||
return CKR_HOST_MEMORY;
|
||||
}
|
||||
list_attributes_seeker(&slot->objects, object_list_seeker);
|
||||
|
||||
list_init(&slot->logins);
|
||||
if (0 != list_init(&slot->logins)) {
|
||||
return CKR_HOST_MEMORY;
|
||||
}
|
||||
} else {
|
||||
/* reuse the old list of logins/objects since they should be empty */
|
||||
list_t logins = slot->logins;
|
||||
|
|
|
@ -203,6 +203,8 @@ get_profile_from_config(struct sc_card *card, char *buffer, size_t size)
|
|||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[i],
|
||||
"card_driver",
|
||||
card->driver->short_name);
|
||||
if (!blocks)
|
||||
continue;
|
||||
blk = blocks[0];
|
||||
free(blocks);
|
||||
if (blk == NULL)
|
||||
|
@ -228,18 +230,22 @@ find_library(struct sc_context *ctx, const char *name)
|
|||
|
||||
for (i = 0; ctx->conf_blocks[i]; i++) {
|
||||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[i], "framework", "pkcs15");
|
||||
blk = blocks[0];
|
||||
free(blocks);
|
||||
if (blk == NULL)
|
||||
continue;
|
||||
blocks = scconf_find_blocks(ctx->conf, blk, "pkcs15init", name);
|
||||
if (!blocks)
|
||||
continue;
|
||||
blk = blocks[0];
|
||||
free(blocks);
|
||||
if (blk == NULL)
|
||||
continue;
|
||||
libname = scconf_get_str(blk, "module", NULL);
|
||||
break;
|
||||
}
|
||||
free(blocks);
|
||||
if (blk == NULL)
|
||||
continue;
|
||||
blocks = scconf_find_blocks(ctx->conf, blk, "pkcs15init", name);
|
||||
if (!blocks)
|
||||
continue;
|
||||
blk = blocks[0];
|
||||
free(blocks);
|
||||
if (blk == NULL)
|
||||
continue;
|
||||
libname = scconf_get_str(blk, "module", NULL);
|
||||
break;
|
||||
}
|
||||
if (!libname) {
|
||||
sc_log(ctx, "unable to locate pkcs15init driver for '%s'", name);
|
||||
}
|
||||
|
|
|
@ -107,11 +107,10 @@ static scconf_item *scconf_item_add_internal(scconf_parser * parser, int type)
|
|||
return item;
|
||||
}
|
||||
}
|
||||
item = malloc(sizeof(scconf_item));
|
||||
item = calloc(1, sizeof(scconf_item));
|
||||
if (!item) {
|
||||
return NULL;
|
||||
}
|
||||
memset(item, 0, sizeof(scconf_item));
|
||||
item->type = type;
|
||||
|
||||
item->key = parser->key;
|
||||
|
@ -177,12 +176,14 @@ static void scconf_block_add_internal(scconf_parser * parser)
|
|||
scconf_item *item;
|
||||
|
||||
item = scconf_item_add_internal(parser, SCCONF_ITEM_TYPE_BLOCK);
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
block = malloc(sizeof(scconf_block));
|
||||
block = calloc(1, sizeof(scconf_block));
|
||||
if (!block) {
|
||||
return;
|
||||
}
|
||||
memset(block, 0, sizeof(scconf_block));
|
||||
block->parent = parser->block;
|
||||
item->value.block = block;
|
||||
|
||||
|
@ -259,6 +260,9 @@ void scconf_parse_token(scconf_parser * parser, int token_type, const char *toke
|
|||
/* fall through - treat empty lines as comments */
|
||||
case TOKEN_TYPE_COMMENT:
|
||||
item = scconf_item_add_internal(parser, SCCONF_ITEM_TYPE_COMMENT);
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
item->value.comment = token ? strdup(token) : NULL;
|
||||
break;
|
||||
case TOKEN_TYPE_STRING:
|
||||
|
|
|
@ -35,13 +35,12 @@ scconf_context *scconf_new(const char *filename)
|
|||
{
|
||||
scconf_context *config;
|
||||
|
||||
config = malloc(sizeof(scconf_context));
|
||||
config = calloc(1, sizeof(scconf_context));
|
||||
if (!config) {
|
||||
return NULL;
|
||||
}
|
||||
memset(config, 0, sizeof(scconf_context));
|
||||
config->filename = filename ? strdup(filename) : NULL;
|
||||
config->root = malloc(sizeof(scconf_block));
|
||||
config->root = calloc(1, sizeof(scconf_block));
|
||||
if (!config->root) {
|
||||
if (config->filename) {
|
||||
free(config->filename);
|
||||
|
@ -49,7 +48,6 @@ scconf_context *scconf_new(const char *filename)
|
|||
free(config);
|
||||
return NULL;
|
||||
}
|
||||
memset(config->root, 0, sizeof(scconf_block));
|
||||
return config;
|
||||
}
|
||||
|
||||
|
@ -107,6 +105,8 @@ scconf_block **scconf_find_blocks(const scconf_context * config, const scconf_bl
|
|||
for (item = block->items; item; item = item->next) {
|
||||
if (item->type == SCCONF_ITEM_TYPE_BLOCK &&
|
||||
strcasecmp(item_name, item->key) == 0) {
|
||||
if (!item->value.block)
|
||||
continue;
|
||||
if (key && strcasecmp(key, item->value.block->name->data)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -207,21 +207,19 @@ scconf_item *scconf_item_copy(const scconf_item * src, scconf_item ** dst)
|
|||
{
|
||||
scconf_item *ptr, *_dst = NULL, *next = NULL;
|
||||
|
||||
next = malloc(sizeof(scconf_item));
|
||||
next = calloc(1, sizeof(scconf_item));
|
||||
if (!next) {
|
||||
return NULL;
|
||||
}
|
||||
memset(next, 0, sizeof(scconf_item));
|
||||
ptr = next;
|
||||
_dst = next;
|
||||
while (src) {
|
||||
if (!next) {
|
||||
next = malloc(sizeof(scconf_item));
|
||||
next = calloc(1, sizeof(scconf_item));
|
||||
if (!next) {
|
||||
scconf_item_destroy(ptr);
|
||||
return NULL;
|
||||
}
|
||||
memset(next, 0, sizeof(scconf_item));
|
||||
_dst->next = next;
|
||||
}
|
||||
next->type = src->type;
|
||||
|
@ -281,7 +279,7 @@ scconf_block *scconf_block_copy(const scconf_block * src, scconf_block ** dst)
|
|||
if (src) {
|
||||
scconf_block *_dst = NULL;
|
||||
|
||||
_dst = malloc(sizeof(scconf_block));
|
||||
_dst = calloc(1, sizeof(scconf_block));
|
||||
if (!_dst) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -311,11 +309,10 @@ scconf_list *scconf_list_add(scconf_list ** list, const char *value)
|
|||
{
|
||||
scconf_list *rec, **tmp;
|
||||
|
||||
rec = malloc(sizeof(scconf_list));
|
||||
rec = calloc(1, sizeof(scconf_list));
|
||||
if (!rec) {
|
||||
return NULL;
|
||||
}
|
||||
memset(rec, 0, sizeof(scconf_list));
|
||||
rec->data = value ? strdup(value) : NULL;
|
||||
|
||||
if (!*list) {
|
||||
|
@ -413,11 +410,10 @@ char *scconf_list_strdup(const scconf_list * list, const char *filler)
|
|||
}
|
||||
if (len == 0)
|
||||
return NULL;
|
||||
buf = malloc(len);
|
||||
buf = calloc(1, len);
|
||||
if (!buf) {
|
||||
return NULL;
|
||||
}
|
||||
memset(buf, 0, len);
|
||||
while (list && list->data) {
|
||||
strcat(buf, list->data);
|
||||
if (filler) {
|
||||
|
|
|
@ -45,17 +45,23 @@ static void buf_init(BUFHAN * bp, FILE * fp, const char *saved_string)
|
|||
bp->fp = fp;
|
||||
bp->saved_char = 0;
|
||||
bp->buf = malloc(256);
|
||||
bp->bufmax = 256;
|
||||
if (bp->buf) {
|
||||
bp->bufmax = 256;
|
||||
bp->buf[0] = '\0';
|
||||
} else
|
||||
bp->bufmax = 0;
|
||||
bp->bufcur = 0;
|
||||
bp->buf[0] = '\0';
|
||||
bp->saved_string = saved_string;
|
||||
}
|
||||
|
||||
static void buf_addch(BUFHAN * bp, char ch)
|
||||
{
|
||||
if (bp->bufcur >= bp->bufmax) {
|
||||
char *p = (char *) realloc(bp->buf, bp->bufmax + 256);
|
||||
if (!p)
|
||||
return;
|
||||
bp->bufmax += 256;
|
||||
bp->buf = (char *) realloc(bp->buf, bp->bufmax);
|
||||
bp->buf = p;
|
||||
}
|
||||
if (bp->buf) {
|
||||
bp->buf[bp->bufcur++] = ch;
|
||||
|
|
|
@ -167,7 +167,7 @@ static int opensc_get_conf_entry(const char *config)
|
|||
key++;
|
||||
|
||||
blocks = scconf_find_blocks(ctx->conf, NULL, section, name);
|
||||
if (blocks[0])
|
||||
if (blocks && blocks[0])
|
||||
conf_block = blocks[0];
|
||||
free(blocks);
|
||||
if (conf_block != NULL) {
|
||||
|
@ -224,7 +224,7 @@ static int opensc_set_conf_entry(const char *config)
|
|||
value++;
|
||||
|
||||
blocks = scconf_find_blocks(ctx->conf, NULL, section, name);
|
||||
if (blocks[0])
|
||||
if (blocks && blocks[0])
|
||||
conf_block = blocks[0];
|
||||
free(blocks);
|
||||
if (conf_block != NULL) {
|
||||
|
|
|
@ -213,6 +213,9 @@ static int load_cert(const char * cert_id, const char * cert_file,
|
|||
|
||||
derlen = i2d_X509(cert, NULL);
|
||||
der = malloc(derlen);
|
||||
if (!der) {
|
||||
goto err;
|
||||
}
|
||||
p = der;
|
||||
i2d_X509(cert, &p);
|
||||
}
|
||||
|
@ -485,6 +488,10 @@ int main(int argc, char * const argv[])
|
|||
case 's':
|
||||
opt_apdus = (char **) realloc(opt_apdus,
|
||||
(opt_apdu_count + 1) * sizeof(char *));
|
||||
if (!opt_apdus) {
|
||||
err = 1;
|
||||
goto end;
|
||||
}
|
||||
opt_apdus[opt_apdu_count] = optarg;
|
||||
do_send_apdu++;
|
||||
if (opt_apdu_count == 0)
|
||||
|
|
|
@ -1054,7 +1054,7 @@ static void list_slots(int tokens, int refresh, int print)
|
|||
p11_slots = calloc(p11_num_slots, sizeof(CK_SLOT_ID));
|
||||
if (p11_slots == NULL) {
|
||||
perror("calloc failed");
|
||||
return;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
rv = p11->C_GetSlotList(tokens, p11_slots, &p11_num_slots);
|
||||
|
@ -4796,7 +4796,7 @@ static int encrypt_decrypt(CK_SESSION_HANDLE session,
|
|||
encrypted_len = EVP_PKEY_encrypt(encrypted, orig_data, sizeof(orig_data), pkey);
|
||||
#endif
|
||||
EVP_PKEY_free(pkey);
|
||||
if (encrypted_len <= 0) {
|
||||
if (((int) encrypted_len) <= 0) {
|
||||
fprintf(stderr, "Encryption failed, returning\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -888,6 +888,8 @@ static void print_ssh_key(FILE *outf, const char * alg, struct sc_pkcs15_object
|
|||
int r;
|
||||
|
||||
uu = malloc(len*2); // Way over - even if we have extra LFs; as each 6 bits take one byte.
|
||||
if (!uu)
|
||||
return;
|
||||
|
||||
if (opt_rfc4716) {
|
||||
r = sc_base64_encode(buf, len, uu, 2*len, 64);
|
||||
|
|
|
@ -250,6 +250,9 @@ static int createShares(const BIGNUM *s, const unsigned char t, const unsigned c
|
|||
unsigned long i;
|
||||
secret_share_t *sp;
|
||||
|
||||
if (!polynomial)
|
||||
return -1;
|
||||
|
||||
// Set the secret value as the constant part of the polynomial
|
||||
pp = polynomial;
|
||||
*pp = BN_new();
|
||||
|
@ -310,6 +313,9 @@ static int reconstructSecret(secret_share_t *shares, unsigned char t, const BIGN
|
|||
secret_share_t *sp_j;
|
||||
BN_CTX *ctx;
|
||||
|
||||
if (!bValue)
|
||||
return -1;
|
||||
|
||||
// Initialize
|
||||
pbValue = bValue;
|
||||
for (i = 0; i < t; i++) {
|
||||
|
@ -656,15 +662,17 @@ static int recreate_password_from_shares(char **pwd, int *pwdlen, int num_of_pas
|
|||
return -1;
|
||||
}
|
||||
|
||||
// Allocate data buffer for the shares
|
||||
shares = malloc(num_of_password_shares * sizeof(secret_share_t));
|
||||
if (!shares)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Initialize prime and secret
|
||||
*/
|
||||
prime = BN_new();
|
||||
secret = BN_new();
|
||||
|
||||
// Allocate data buffer for the shares
|
||||
shares = malloc(num_of_password_shares * sizeof(secret_share_t));
|
||||
|
||||
printf("\nDeciphering the DKEK for import into the SmartCard-HSM requires %i key custodians", num_of_password_shares);
|
||||
printf("\nto present their share. Only the first key custodian needs to enter the public prime.");
|
||||
printf("\nPlease remember to present the share id as well as the share value.");
|
||||
|
@ -733,14 +741,16 @@ static int recreate_password_from_shares(char **pwd, int *pwdlen, int num_of_pas
|
|||
ip = (unsigned char *) inbuf;
|
||||
*pwdlen = BN_bn2bin(secret, ip);
|
||||
*pwd = calloc(1, *pwdlen);
|
||||
memcpy(*pwd, ip, *pwdlen);
|
||||
if (*pwd) {
|
||||
memcpy(*pwd, ip, *pwdlen);
|
||||
}
|
||||
|
||||
cleanUpShares(shares, num_of_password_shares);
|
||||
|
||||
BN_clear_free(prime);
|
||||
BN_clear_free(secret);
|
||||
|
||||
return 0;
|
||||
return *pwd ? 0 : -1;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -106,7 +106,8 @@ static int do_convert_bignum(sc_pkcs15_bignum_t *dst, const BIGNUM *src)
|
|||
if (src == 0) return 0;
|
||||
dst->len = BN_num_bytes(src);
|
||||
dst->data = malloc(dst->len);
|
||||
BN_bn2bin(src, dst->data);
|
||||
if (!dst->data) return 0;
|
||||
if (!BN_bn2bin(src, dst->data)) return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue