1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-03 13:20:26 +02:00

* gh_data.c (gh_scm2chars, gh_scm2shorts, gh_scm2longs),

(gh_scm2floats, gh_scm2doubles): Check for malloc() returning NULL
in various places.
(gh_scm2newstr, gh_symbol2newstr): Change call to
scm_must_malloc() to malloc(), because user-free()able memory is
allocated.
* gc.c: Added declaration of `scm_debug_check_freelist'.
This commit is contained in:
Martin Grabmüller 2001-03-14 10:02:12 +00:00
parent 26a3038db8
commit d3dd80ab5b
3 changed files with 60 additions and 12 deletions

View file

@ -1,3 +1,14 @@
2001-03-14 Martin Grabmueller <mgrabmue@cs.tu-berlin.de>
* gh_data.c (gh_scm2chars, gh_scm2shorts, gh_scm2longs),
(gh_scm2floats, gh_scm2doubles): Check for malloc() returning NULL
in various places.
(gh_scm2newstr, gh_symbol2newstr): Change call to
scm_must_malloc() to malloc(), because user-free()able memory is
allocated.
* gc.c: Added declaration of `scm_debug_check_freelist'.
2001-03-13 Martin Grabmueller <mgrabmue@cs.tu-berlin.de>
* ports.c (scm_port_mode): Changed `mode' array size to 4.

View file

@ -609,6 +609,10 @@ SCM_DEFINE (scm_free_list_length, "free-list-length", 0, 0, 0,
#ifdef GUILE_DEBUG_FREELIST
/* Non-zero if freelist debugging is in effect. Set this via
`gc-set-debug-check-freelist!'. */
static int scm_debug_check_freelist = 0;
/* Number of calls to SCM_NEWCELL since startup. */
static unsigned long scm_newcell_count;
static unsigned long scm_newcell2_count;

View file

@ -258,7 +258,7 @@ gh_scm2char (SCM obj)
/* Convert a vector, weak vector, string, substring or uniform vector
into an array of chars. If result array in arg 2 is NULL, malloc a
new one. */
new one. If out of memory, return NULL. */
char *
gh_scm2chars (SCM obj, char *m)
{
@ -286,6 +286,8 @@ gh_scm2chars (SCM obj, char *m)
}
if (m == 0)
m = (char *) malloc (n * sizeof (char));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
m[i] = SCM_INUM (SCM_VELTS (obj)[i]);
break;
@ -294,6 +296,8 @@ gh_scm2chars (SCM obj, char *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (char *) malloc (n * sizeof (char));
if (m == NULL)
return NULL;
memcpy (m, SCM_VELTS (obj), n * sizeof (char));
break;
#endif
@ -302,6 +306,8 @@ gh_scm2chars (SCM obj, char *m)
n = SCM_STRING_LENGTH (obj);
if (m == 0)
m = (char *) malloc (n * sizeof (char));
if (m == NULL)
return NULL;
memcpy (m, SCM_VELTS (obj), n * sizeof (char));
break;
default:
@ -311,7 +317,8 @@ gh_scm2chars (SCM obj, char *m)
}
/* Convert a vector, weak vector or uniform vector into an array of
shorts. If result array in arg 2 is NULL, malloc a new one. */
shorts. If result array in arg 2 is NULL, malloc a new one. If
out of memory, return NULL. */
short *
gh_scm2shorts (SCM obj, short *m)
{
@ -339,6 +346,8 @@ gh_scm2shorts (SCM obj, short *m)
}
if (m == 0)
m = (short *) malloc (n * sizeof (short));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
m[i] = SCM_INUM (SCM_VELTS (obj)[i]);
break;
@ -347,6 +356,8 @@ gh_scm2shorts (SCM obj, short *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (short *) malloc (n * sizeof (short));
if (m == NULL)
return NULL;
memcpy (m, SCM_VELTS (obj), n * sizeof (short));
break;
#endif
@ -357,7 +368,8 @@ gh_scm2shorts (SCM obj, short *m)
}
/* Convert a vector, weak vector or uniform vector into an array of
longs. If result array in arg 2 is NULL, malloc a new one. */
longs. If result array in arg 2 is NULL, malloc a new one. If out
of memory, return NULL. */
long *
gh_scm2longs (SCM obj, long *m)
{
@ -378,6 +390,8 @@ gh_scm2longs (SCM obj, long *m)
}
if (m == 0)
m = (long *) malloc (n * sizeof (long));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
{
val = SCM_VELTS (obj)[i];
@ -390,6 +404,8 @@ gh_scm2longs (SCM obj, long *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (long *) malloc (n * sizeof (long));
if (m == NULL)
return NULL;
memcpy (m, SCM_VELTS (obj), n * sizeof (long));
break;
#endif
@ -400,7 +416,8 @@ gh_scm2longs (SCM obj, long *m)
}
/* Convert a vector, weak vector or uniform vector into an array of
floats. If result array in arg 2 is NULL, malloc a new one. */
floats. If result array in arg 2 is NULL, malloc a new one. If
out of memory, return NULL. */
float *
gh_scm2floats (SCM obj, float *m)
{
@ -422,6 +439,8 @@ gh_scm2floats (SCM obj, float *m)
}
if (m == 0)
m = (float *) malloc (n * sizeof (float));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
{
val = SCM_VELTS (obj)[i];
@ -438,6 +457,8 @@ gh_scm2floats (SCM obj, float *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (float *) malloc (n * sizeof (float));
if (m == NULL)
return NULL;
memcpy (m, (float *) SCM_VELTS (obj), n * sizeof (float));
break;
@ -445,6 +466,8 @@ gh_scm2floats (SCM obj, float *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (float*) malloc (n * sizeof (float));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
m[i] = ((double *) SCM_VELTS (obj))[i];
break;
@ -456,7 +479,8 @@ gh_scm2floats (SCM obj, float *m)
}
/* Convert a vector, weak vector or uniform vector into an array of
doubles. If result array in arg 2 is NULL, malloc a new one. */
doubles. If result array in arg 2 is NULL, malloc a new one. If
out of memory, return NULL. */
double *
gh_scm2doubles (SCM obj, double *m)
{
@ -478,6 +502,8 @@ gh_scm2doubles (SCM obj, double *m)
}
if (m == 0)
m = (double *) malloc (n * sizeof (double));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
{
val = SCM_VELTS (obj)[i];
@ -494,6 +520,8 @@ gh_scm2doubles (SCM obj, double *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (double *) malloc (n * sizeof (double));
if (m == NULL)
return NULL;
for (i = 0; i < n; ++i)
m[i] = ((float *) SCM_VELTS (obj))[i];
break;
@ -502,6 +530,8 @@ gh_scm2doubles (SCM obj, double *m)
n = SCM_UVECTOR_LENGTH (obj);
if (m == 0)
m = (double*) malloc (n * sizeof (double));
if (m == NULL)
return NULL;
memcpy (m, SCM_VELTS (obj), n * sizeof (double));
break;
#endif
@ -518,7 +548,8 @@ gh_scm2doubles (SCM obj, double *m)
non-null, set *lenp to the string's length.
This function uses malloc to obtain storage for the copy; the
caller is responsible for freeing it.
caller is responsible for freeing it. If out of memory, NULL is
returned.
Note that Scheme strings may contain arbitrary data, including null
characters. This means that null termination is not a reliable way
@ -535,15 +566,15 @@ gh_scm2newstr (SCM str, int *lenp)
len = SCM_STRING_LENGTH (str);
ret_str = (char *) scm_must_malloc ((len + 1) * sizeof (char),
"gh_scm2newstr");
ret_str = (char *) malloc ((len + 1) * sizeof (char));
if (ret_str == NULL)
return NULL;
/* so we copy tmp_str to ret_str, which is what we will allocate */
memcpy (ret_str, SCM_STRING_CHARS (str), len);
scm_remember_upto_here_1 (str);
/* now make sure we null-terminate it */
ret_str[len] = '\0';
if (lenp != NULL)
{
*lenp = len;
@ -580,7 +611,8 @@ gh_get_substr (SCM src, char *dst, int start, int len)
string's length.
This function uses malloc to obtain storage for the copy; the
caller is responsible for freeing it. */
caller is responsible for freeing it. If out of memory, NULL is
returned.*/
char *
gh_symbol2newstr (SCM sym, int *lenp)
{
@ -591,8 +623,9 @@ gh_symbol2newstr (SCM sym, int *lenp)
len = SCM_SYMBOL_LENGTH (sym);
ret_str = (char *) scm_must_malloc ((len + 1) * sizeof (char),
"gh_symbol2newstr");
ret_str = (char *) malloc ((len + 1) * sizeof (char));
if (ret_str == NULL)
return NULL;
/* so we copy sym to ret_str, which is what we will allocate */
memcpy (ret_str, SCM_SYMBOL_CHARS (sym), len);
scm_remember_upto_here_1 (sym);