Commit 9eea2be6 authored by Bodo Möller's avatar Bodo Möller
Browse files

Avoid coredumps for CONF_get_...(NULL, ...)

parent 69a03c17
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -3,6 +3,15 @@

 Changes between 0.9.6 and 0.9.7  [xx XXX 2000]

  *) In the NCONF_...-based implementations for CONF_... queries
     (crypto/conf/conf_lib.c), if the input LHASH is NULL, avoid using
     a temporary CONF structure with the data component set to NULL
     (which gives segmentation faults in lh_retrieve).
     Instead, use NULL for the CONF pointer in CONF_get_string and
     CONF_get_number (which may use environment variables) and directly
     return NULL from CONF_get_section.
     [Bodo Moeller]

  *) Fix potential buffer overrun for EBCDIC.
     [Ulf Moeller]

+41 −18
Original line number Diff line number Diff line
@@ -130,6 +130,12 @@ LHASH *CONF_load_bio(LHASH *conf, BIO *bp,long *eline)
	}

STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf,char *section)
	{
	if (conf == NULL)
		{
		return NULL;
		}
	else
		{
		CONF ctmp;

@@ -140,8 +146,15 @@ STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf,char *section)
		ctmp.data = conf;
		return NCONF_get_section(&ctmp, section);
		}
	}

char *CONF_get_string(LHASH *conf,char *group,char *name)
	{
	if (conf == NULL)
		{
		return NCONF_get_string(NULL, group, name);
		}
	else
		{
		CONF ctmp;

@@ -152,19 +165,29 @@ char *CONF_get_string(LHASH *conf,char *group,char *name)
		ctmp.data = conf;
		return NCONF_get_string(&ctmp, group, name);
		}
	}

long CONF_get_number(LHASH *conf,char *group,char *name)
	{
	CONF ctmp;
	int status;
	long result = 0;

	if (conf == NULL)
		{
		status = NCONF_get_number_e(NULL, group, name, &result);
		}
	else
		{
		CONF ctmp;

		if (default_CONF_method == NULL)
			default_CONF_method = NCONF_default();

		default_CONF_method->init(&ctmp);
		ctmp.data = conf;
		status = NCONF_get_number_e(&ctmp, group, name, &result);
		}

	if (status == 0)
		{
		/* This function does not believe in errors... */