static void build_SYS_str_reasons(void) { /* OPENSSL_malloc cannot be used here, use static storage instead */ static char strerror_pool[SPACE_SYS_STR_REASONS]; char *cur = strerror_pool; size_t cnt = 0; static int init = 1; int i; int saveerrno = get_last_sys_error(); CRYPTO_THREAD_write_lock(err_string_lock); if (!init) { CRYPTO_THREAD_unlock(err_string_lock); return; } for (i = 1; i <= NUM_SYS_STR_REASONS; i++) { ERR_STRING_DATA *str = &SYS_str_reasons[i - 1]; str->error = ERR_PACK(ERR_LIB_SYS, 0, i); if (str->string == NULL) { if (openssl_strerror_r(i, cur, sizeof(strerror_pool) - cnt)) { size_t l = strlen(cur); str->string = cur; cnt += l; if (cnt > sizeof(strerror_pool)) cnt = sizeof(strerror_pool); cur += l; /* * VMS has an unusual quirk of adding spaces at the end of * some (most? all?) messages. Lets trim them off. */ while (ossl_isspace(cur[-1])) { cur--; cnt--; } *cur++ = '\0'; cnt++; } } if (str->string == NULL) str->string = "unknown"; } /* * Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL}, as * required by ERR_load_strings. */ init = 0; CRYPTO_THREAD_unlock(err_string_lock); /* openssl_strerror_r could change errno, but we want to preserve it */ set_sys_error(saveerrno); err_load_strings(SYS_str_reasons); }
/* Check the extension string for critical flag */ static int v3_check_critical(const char **value) { const char *p = *value; if ((strlen(p) < 9) || strncmp(p, "critical,", 9)) return 0; p += 9; while (ossl_isspace(*p)) p++; *value = p; return 1; }
/* Check extension string for generic extension and return the type */ static int v3_check_generic(const char **value) { int gen_type = 0; const char *p = *value; if ((strlen(p) >= 4) && strncmp(p, "DER:", 4) == 0) { p += 4; gen_type = 1; } else if ((strlen(p) >= 5) && strncmp(p, "ASN1:", 5) == 0) { p += 5; gen_type = 2; } else return 0; while (ossl_isspace(*p)) p++; *value = p; return gen_type; }