Skip to content

Commit b0eafc7

Browse files
authored
Merge pull request #1721 from clasp-developers/bounds-check-char
Bounds checks for CHAR & SCHAR (fix #1717)
2 parents 38f4107 + 28c079c commit b0eafc7

File tree

2 files changed

+25
-30
lines changed

2 files changed

+25
-30
lines changed

include/clasp/core/array.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,4 +999,8 @@ T_mv clasp_vectorStartEnd(Symbol_sp fn, T_sp thing, Fixnum_sp start, Fixnum_sp e
999999
namespace core {
10001000

10011001
void core__copy_subarray(Array_sp dest, Fixnum_sp destStart, Array_sp orig, Fixnum_sp origStart, Fixnum_sp len);
1002+
1003+
T_sp core__rowMajorAset(T_sp, Array_sp, gc::Fixnum);
1004+
T_sp cl__rowMajorAref(Array_sp, gc::Fixnum);
1005+
10021006
}; // namespace core

src/core/string.cc

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -949,29 +949,22 @@ CL_DECLARE();
949949
CL_DOCSTRING(R"dx(CLHS schar)dx");
950950
DOCGROUP(clasp);
951951
CL_DEFUN Character_sp cl__schar(AbstractSimpleVector_sp str, size_t idx) {
952-
if (SimpleBaseString_sp sb = str.asOrNull<SimpleBaseString_O>()) {
953-
return clasp_make_character(sb[idx]);
954-
} else if (SimpleCharacterString_sp sc = str.asOrNull<SimpleCharacterString_O>()) {
955-
return clasp_make_character(sc[idx]);
956-
}
957-
TYPE_ERROR(str, cl::_sym_simple_string);
952+
if (str.isA<SimpleBaseString_O>()
953+
|| str.isA<SimpleCharacterString_O>())
954+
return cl__rowMajorAref(str, idx);
955+
else
956+
TYPE_ERROR(str, cl::_sym_simple_string);
958957
}
959958

960959
CL_LAMBDA(str idx);
961960
CL_DOCSTRING(R"dx(Common lisp char)dx");
962961
DOCGROUP(clasp);
963962
CL_DEFUN Character_sp cl__char(String_sp str, size_t idx) {
964-
/* Return the character at idx - ignore fill pointers */
965-
if (SimpleBaseString_sp sb = str.asOrNull<SimpleBaseString_O>()) {
966-
return clasp_make_character(sb[idx]);
967-
} else if (Str8Ns_sp s8 = str.asOrNull<Str8Ns_O>()) {
968-
return clasp_make_character(s8[idx]);
969-
} else if (SimpleCharacterString_sp sc = str.asOrNull<SimpleCharacterString_O>()) {
970-
return clasp_make_character(sc[idx]);
971-
} else if (StrWNs_sp sw = str.asOrNull<StrWNs_O>()) {
972-
return clasp_make_character(sw[idx]);
973-
}
974-
TYPE_ERROR(str, cl::_sym_string);
963+
if (str.isA<SimpleBaseString_O>() || str.isA<Str8Ns_O>()
964+
|| str.isA<SimpleCharacterString_O>() || str.isA<StrWNs_O>())
965+
return cl__rowMajorAref(str, idx);
966+
else
967+
TYPE_ERROR(str, cl::_sym_string);
975968
};
976969

977970
CL_LISPIFY_NAME("cl:char");
@@ -980,18 +973,12 @@ CL_DECLARE();
980973
CL_DOCSTRING(R"dx(CLHS (setf char))dx");
981974
DOCGROUP(clasp);
982975
CL_DEFUN_SETF Character_sp core__char_set(Character_sp c, String_sp str, size_t idx) {
983-
if (SimpleBaseString_sp sb = str.asOrNull<SimpleBaseString_O>()) {
984-
sb[idx] = c.unsafe_character();
985-
} else if (Str8Ns_sp s8 = str.asOrNull<Str8Ns_O>()) {
986-
s8[idx] = c.unsafe_character();
987-
} else if (SimpleCharacterString_sp sc = str.asOrNull<SimpleCharacterString_O>()) {
988-
sc[idx] = c.unsafe_character();
989-
} else if (StrWNs_sp sw = str.asOrNull<StrWNs_O>()) {
990-
sw[idx] = c.unsafe_character();
991-
} else {
976+
if (str.isA<SimpleBaseString_O>() || str.isA<Str8Ns_O>()
977+
|| str.isA<SimpleCharacterString_O>() || str.isA<StrWNs_O>()) {
978+
core__rowMajorAset(c, str, idx);
979+
return c;
980+
} else
992981
TYPE_ERROR(str, cl::_sym_string);
993-
}
994-
return c;
995982
};
996983

997984
CL_LISPIFY_NAME("cl:schar");
@@ -1000,8 +987,12 @@ CL_DECLARE();
1000987
CL_DOCSTRING(R"dx(CLHS (setf schar))dx");
1001988
DOCGROUP(clasp);
1002989
CL_DEFUN_SETF Character_sp core__schar_set(Character_sp c, String_sp str, size_t idx) {
1003-
str->rowMajorAset(idx, c);
1004-
return c;
990+
if (str.isA<SimpleBaseString_O>()
991+
|| str.isA<SimpleCharacterString_O>()) {
992+
core__rowMajorAset(c, str, idx);
993+
return c;
994+
} else
995+
TYPE_ERROR(str, cl::_sym_simple_string);
1005996
};
1006997

1007998
typedef enum { iinit, iwhite, inum, itrailspace, ijunk, idone } IntegerFSMState;

0 commit comments

Comments
 (0)