summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSandeep Nair2013-01-16 10:55:53 -0600
committerSandeep Nair2013-01-16 10:55:53 -0600
commit0f4e7fa0c06455e1017dfb59ae281a51b4e6d899 (patch)
tree583e437baf125455149ed7d676245df14e69d017
parent850700d12aa8370c6d2b68e55c63d3466367ad4d (diff)
downloadengine-pkcs11-0f4e7fa0c06455e1017dfb59ae281a51b4e6d899.tar.gz
engine-pkcs11-0f4e7fa0c06455e1017dfb59ae281a51b4e6d899.tar.xz
engine-pkcs11-0f4e7fa0c06455e1017dfb59ae281a51b4e6d899.zip
Take care of strtok bugs
-rw-r--r--src/engine_pkcs11.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/engine_pkcs11.c b/src/engine_pkcs11.c
index 41d24ce..0301ec7 100644
--- a/src/engine_pkcs11.c
+++ b/src/engine_pkcs11.c
@@ -816,9 +816,12 @@ static EVP_PKEY *pkcs11_load_key
816 k->isPrivate ? 'P' : ' ', 816 k->isPrivate ? 'P' : ' ',
817 k->needLogin ? 'L' : ' ', k->label); 817 k->needLogin ? 'L' : ' ', k->label);
818 } 818 }
819
820 if (!!isPrivate != !!(k->isPrivate)) continue;
821
819 if (key_label == NULL) { 822 if (key_label == NULL) {
820 if (key_id_len != 0 && k->id_len == key_id_len 823 if (key_id_len != 0 && k->id_len == key_id_len
821 && memcmp(k->id, key_id, key_id_len) == 0) { 824 && (memcmp(k->id, key_id, key_id_len) == 0)) {
822 selected_key = k; 825 selected_key = k;
823 } 826 }
824 } else { 827 } else {
@@ -1292,17 +1295,21 @@ static int parse_cert_store_string
1292{ 1295{
1293 char *token; 1296 char *token;
1294 const char *sep = ":"; 1297 const char *sep = ":";
1295 char *str = (char *)cert_store_str; 1298 char *str, *lasts;
1296 1299
1297 if (!cert_store_str) 1300 if (!cert_store_str)
1298 return -1; 1301 return -1;
1299 1302
1303 str = strdup(cert_store_str);
1304 if (str == NULL)
1305 return -1;
1306
1300 /* Default values */ 1307 /* Default values */
1301 *slot = 0; 1308 *slot = 0;
1302 *label = NULL; 1309 *label = NULL;
1303 *cert_file = NULL; 1310 *cert_file = NULL;
1304 1311
1305 token = strtok(str, sep); 1312 token = strtok_r(str, sep, &lasts);
1306 1313
1307 while (token) { 1314 while (token) {
1308 1315
@@ -1336,7 +1343,7 @@ static int parse_cert_store_string
1336 return -1; 1343 return -1;
1337 } 1344 }
1338 } 1345 }
1339 token = strtok(NULL, sep); 1346 token = strtok_r(NULL, sep, &lasts);
1340 } /* end while(token) */ 1347 } /* end while(token) */
1341 1348
1342 if (*cert_file == NULL) { 1349 if (*cert_file == NULL) {
@@ -1406,17 +1413,21 @@ static int parse_key_gen_string
1406{ 1413{
1407 char *token; 1414 char *token;
1408 const char *sep = ":"; 1415 const char *sep = ":";
1409 char *str = (char *)key_gen_str; 1416 char *str, *lasts;
1410 1417
1411 if (!key_gen_str) 1418 if (!key_gen_str)
1412 return -1; 1419 return -1;
1413 1420
1421 str = strdup(key_gen_str);
1422 if (str == NULL)
1423 return -1;
1424
1414 /* Default values */ 1425 /* Default values */
1415 *slot = 0; 1426 *slot = 0;
1416 *label = NULL; 1427 *label = NULL;
1417 *key_size = -1; 1428 *key_size = -1;
1418 1429
1419 token = strtok(str, sep); 1430 token = strtok_r(str, sep, &lasts);
1420 1431
1421 while (token) { 1432 while (token) {
1422 1433
@@ -1449,7 +1460,7 @@ static int parse_key_gen_string
1449 return -1; 1460 return -1;
1450 } 1461 }
1451 } 1462 }
1452 token = strtok(NULL, sep); 1463 token = strtok_r(NULL, sep, &lasts);
1453 } /* end while(token) */ 1464 } /* end while(token) */
1454 1465
1455 if (*key_size == -1) { 1466 if (*key_size == -1) {
@@ -1629,17 +1640,21 @@ static int parse_del_obj_string
1629{ 1640{
1630 char *token; 1641 char *token;
1631 const char *sep = ":"; 1642 const char *sep = ":";
1632 char *str = (char *)del_obj_str; 1643 char *str, *lasts;
1633 1644
1634 if (!del_obj_str) 1645 if (!del_obj_str)
1635 return -1; 1646 return -1;
1636 1647
1648 str = strdup(del_obj_str);
1649 if (str == NULL)
1650 return -1;
1651
1637 /* Default values */ 1652 /* Default values */
1638 *slot = 0; 1653 *slot = 0;
1639 *label = NULL; 1654 *label = NULL;
1640 *type = NULL; 1655 *type = NULL;
1641 1656
1642 token = strtok(str, sep); 1657 token = strtok_r(str, sep, &lasts);
1643 1658
1644 while (token) { 1659 while (token) {
1645 1660
@@ -1673,7 +1688,7 @@ static int parse_del_obj_string
1673 return -1; 1688 return -1;
1674 } 1689 }
1675 } 1690 }
1676 token = strtok(NULL, sep); 1691 token = strtok_r(NULL, sep, &lasts);
1677 } /* end while(token) */ 1692 } /* end while(token) */
1678 1693
1679 if (*type == NULL) { 1694 if (*type == NULL) {
@@ -1931,17 +1946,21 @@ static int parse_key_string
1931{ 1946{
1932 char *token; 1947 char *token;
1933 const char *sep = ":"; 1948 const char *sep = ":";
1934 char *str = (char *)key_get_str; 1949 char *str, *lasts;
1935 1950
1936 if (!key_get_str) 1951 if (!key_get_str)
1937 return -1; 1952 return -1;
1938 1953
1954 str = strdup(key_get_str);
1955 if (str == NULL)
1956 return -1;
1957
1939 /* Default values */ 1958 /* Default values */
1940 *slot = 0; 1959 *slot = 0;
1941 *label = NULL; 1960 *label = NULL;
1942 *key_file = NULL; 1961 if (key_file) *key_file = NULL;
1943 1962
1944 token = strtok(str, sep); 1963 token = strtok_r(str, sep, &lasts);
1945 1964
1946 while (token) { 1965 while (token) {
1947 1966
@@ -1950,14 +1969,14 @@ static int parse_key_string
1950 /* slot is a decimal number */ 1969 /* slot is a decimal number */
1951 if (sscanf(token + 5, "%d", slot) != 1) { 1970 if (sscanf(token + 5, "%d", slot) != 1) {
1952 fprintf(stderr, "slot number not deciphered!\n"); 1971 fprintf(stderr, "slot number not deciphered!\n");
1953 return -1; 1972 goto err;
1954 } 1973 }
1955 } else if (!strncmp(token, "id_", 3)) { 1974 } else if (!strncmp(token, "id_", 3)) {
1956 /* certificate ID */ 1975 /* certificate ID */
1957 /* id is hexadecimal number */ 1976 /* id is hexadecimal number */
1958 if (!hex_to_bin(token + 3, id, id_len)) { 1977 if (!hex_to_bin(token + 3, id, id_len)) {
1959 fprintf(stderr, "id not deciphered!\n"); 1978 fprintf(stderr, "id not deciphered!\n");
1960 return -1; 1979 goto err;
1961 } 1980 }
1962 } else if (!strncmp(token, "label_", 6)) { 1981 } else if (!strncmp(token, "label_", 6)) {
1963 /* label */ 1982 /* label */
@@ -1965,24 +1984,28 @@ static int parse_key_string
1965 *label = strdup(token + 6); 1984 *label = strdup(token + 6);
1966 if (*label == NULL) { 1985 if (*label == NULL) {
1967 fprintf(stderr, "label not deciphered!\n"); 1986 fprintf(stderr, "label not deciphered!\n");
1968 return -1; 1987 goto err;
1969 } 1988 }
1970 } else if ((key_file) && (!strncmp(token, "key_", 4))) { 1989 } else if ((key_file) && (!strncmp(token, "key_", 4))) {
1971 /* key file name */ 1990 /* key file name */
1972 *key_file = strdup(token + 4); 1991 *key_file = strdup(token + 4);
1973 if (*key_file == NULL) { 1992 if (*key_file == NULL) {
1974 fprintf(stderr, "key file not deciphered!\n"); 1993 fprintf(stderr, "key file not deciphered!\n");
1975 return -1; 1994 goto err;
1976 } 1995 }
1977 } 1996 }
1978 token = strtok(NULL, sep); 1997 token = strtok_r(NULL, sep, &lasts);
1979 } /* end while(token) */ 1998 } /* end while(token) */
1980 1999
1981 if ((key_file) && (*key_file == NULL)) { 2000 if ((key_file) && (*key_file == NULL)) {
1982 fprintf(stderr, "key file name not present!\n"); 2001 fprintf(stderr, "key file name not present!\n");
1983 return -1; 2002 goto err;
1984 } 2003 }
1985 2004
1986 return 0; 2005 return 0;
2006
2007err:
2008 free(str);
2009 return -1;
1987} 2010}
1988 2011