diff options
author | Sandeep Nair | 2013-01-16 10:55:53 -0600 |
---|---|---|
committer | Sandeep Nair | 2013-01-16 10:55:53 -0600 |
commit | 0f4e7fa0c06455e1017dfb59ae281a51b4e6d899 (patch) | |
tree | 583e437baf125455149ed7d676245df14e69d017 | |
parent | 850700d12aa8370c6d2b68e55c63d3466367ad4d (diff) | |
download | engine-pkcs11-0f4e7fa0c06455e1017dfb59ae281a51b4e6d899.tar.gz engine-pkcs11-0f4e7fa0c06455e1017dfb59ae281a51b4e6d899.tar.xz engine-pkcs11-0f4e7fa0c06455e1017dfb59ae281a51b4e6d899.zip |
Take care of strtok bugs
-rw-r--r-- | src/engine_pkcs11.c | 61 |
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 | |||
2007 | err: | ||
2008 | free(str); | ||
2009 | return -1; | ||
1987 | } | 2010 | } |
1988 | 2011 | ||