summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2001-02-08 11:40:51 +0000
committerDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2001-02-08 11:40:51 +0000
commitcb0d8be234beaaa95481f2c5c7a2a0849d4f2a0f (patch)
treee1585811bd38b92f56eea53a96b0d5a312358581
parente382fdbe0f4c540dd70e6e77ccbf9368d7cea2e4 (diff)
downloadguile-cb0d8be234beaaa95481f2c5c7a2a0849d4f2a0f.tar.gz
* Fixed parameter checking for make-string.
* Corrected a bug introduced with the last patch.
-rw-r--r--libguile/ChangeLog13
-rw-r--r--libguile/strings.c59
-rw-r--r--libguile/strings.h1
-rw-r--r--libguile/vectors.c2
4 files changed, 55 insertions, 20 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index 14033e6b5..fa1ac14f3 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,5 +1,18 @@
2001-02-08 Dirk Herrmann <D.Herrmann@tu-bs.de>
+ * strings.h (SCM_STRING_MAX_LENGTH): New macro.
+
+ * strings.c (scm_makstr, scm_take_str, scm_make_string): Added
+ range checking for the size parameter. Thanks to Martin
+ Grabmueller for the hint.
+
+ (scm_makstr): Reordered string initialization to make interrupt
+ deferring unnecessary.
+
+ * vectors.c (scm_make_vector): Fixed range checking.
+
+2001-02-08 Dirk Herrmann <D.Herrmann@tu-bs.de>
+
* vectors.h (SCM_VECTOR_MAX_LENGTH): New macro.
* vectors.c (scm_make_vector, scm_c_make_vector): Improved the
diff --git a/libguile/strings.c b/libguile/strings.c
index 677a1d4bd..751521cb4 100644
--- a/libguile/strings.c
+++ b/libguile/strings.c
@@ -124,19 +124,27 @@ SCM_DEFINE (scm_string, "string", 0, 0, 1,
}
#undef FUNC_NAME
+
SCM
scm_makstr (long len, int dummy)
+#define FUNC_NAME "scm_makstr"
{
SCM s;
- char *mem = (char *) scm_must_malloc (len + 1, "scm_makstr");
+ char *mem;
+
+ SCM_ASSERT_RANGE (1, scm_long2num (len), len <= SCM_STRING_MAX_LENGTH);
+ mem = (char *) scm_must_malloc (len + 1, FUNC_NAME);
mem[len] = 0;
+
SCM_NEWCELL (s);
SCM_SET_STRING_CHARS (s, mem);
SCM_SET_STRING_LENGTH (s, len);
return s;
}
+#undef FUNC_NAME
+
/* converts C scm_array of strings to SCM scm_list of strings. */
/* If argc < 0, a null terminated scm_array is assumed. */
@@ -164,16 +172,21 @@ scm_makfromstrs (int argc, char **argv)
made up. */
SCM
scm_take_str (char *s, int len)
+#define FUNC_NAME "scm_take_str"
{
SCM answer;
+
+ SCM_ASSERT_RANGE (2, scm_ulong2num (len), len <= SCM_STRING_MAX_LENGTH);
+
SCM_NEWCELL (answer);
- SCM_DEFER_INTS;
+ SCM_SET_STRING_CHARS (answer, s);
SCM_SET_STRING_LENGTH (answer, len);
scm_done_malloc (len + 1);
- SCM_SET_STRING_CHARS (answer, s);
- SCM_ALLOW_INTS;
+
return answer;
}
+#undef FUNC_NAME
+
/* `s' must be a malloc'd string. See scm_take_str. */
SCM
@@ -208,8 +221,6 @@ scm_makfrom0str_opt (const char *src)
}
-
-
SCM_DEFINE (scm_make_string, "make-string", 1, 1, 0,
(SCM k, SCM chr),
"Returns a newly allocated string of\n"
@@ -218,24 +229,34 @@ SCM_DEFINE (scm_make_string, "make-string", 1, 1, 0,
"STRING are unspecified.\n")
#define FUNC_NAME s_scm_make_string
{
- SCM res;
- register long i;
- SCM_VALIDATE_INUM_MIN_COPY (1,k,0,i);
- res = scm_makstr (i, 0);
- if (!SCM_UNBNDP (chr))
+ if (SCM_INUMP (k))
{
- SCM_VALIDATE_CHAR (2,chr);
- {
- unsigned char *dst = SCM_STRING_UCHARS (res);
- char c = SCM_CHAR (chr);
-
- memset (dst, c, i);
- }
+ long int i = SCM_INUM (k);
+ SCM res;
+
+ SCM_ASSERT_RANGE (1, k, i >= 0);
+
+ res = scm_makstr (i, 0);
+ if (!SCM_UNBNDP (chr))
+ {
+ unsigned char *dst;
+
+ SCM_VALIDATE_CHAR (2, chr);
+
+ dst = SCM_STRING_UCHARS (res);
+ memset (dst, SCM_CHAR (chr), i);
+ }
+
+ return res;
}
- return res;
+ else if (SCM_BIGP (k))
+ SCM_OUT_OF_RANGE (1, k);
+ else
+ SCM_WRONG_TYPE_ARG (1, k);
}
#undef FUNC_NAME
+
SCM_DEFINE (scm_string_length, "string-length", 1, 0, 0,
(SCM string),
"Returns the number of characters in STRING")
diff --git a/libguile/strings.h b/libguile/strings.h
index 53a6e2ba9..cc3b54669 100644
--- a/libguile/strings.h
+++ b/libguile/strings.h
@@ -57,6 +57,7 @@
#define SCM_STRING_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
#endif
#define SCM_SET_STRING_CHARS(s, c) (SCM_SET_CELL_WORD_1 ((s), (c)))
+#define SCM_STRING_MAX_LENGTH ((1L << 24) - 1)
#define SCM_STRING_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
#define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), ((l) << 8) + scm_tc7_string))
diff --git a/libguile/vectors.c b/libguile/vectors.c
index 7e36ebafc..d55a51cf3 100644
--- a/libguile/vectors.c
+++ b/libguile/vectors.c
@@ -275,7 +275,7 @@ SCM_DEFINE (scm_make_vector, "make-vector", 1, 1, 0,
if (SCM_INUMP (k))
{
- SCM_ASSERT_RANGE (1, k, k >= 0);
+ SCM_ASSERT_RANGE (1, k, SCM_INUM (k) >= 0);
return scm_c_make_vector (SCM_INUM (k), fill);
}
else if (SCM_BIGP (k))