Changeset: fb708a754086 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fb708a754086
Modified Files:
monetdb5/modules/atoms/str.c
Branch: default
Log Message:
Don't write outside the allocated buffer.
diffs (51 lines):
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -2415,20 +2415,35 @@ STRinsert(str *ret, const str *s, const
{
str v;
int strt = *start;
- if (strcmp(*s2, str_nil) == 0 || strcmp(*s, str_nil) == 0)
- *ret = GDKstrdup((str) str_nil);
- else {
- if (strt < 0)
- strt = 1;
- if(strlen(*s)+strlen(*s2)+1 >= INT_MAX) {
+ if (strcmp(*s2, str_nil) == 0 || strcmp(*s, str_nil) == 0) {
+ if ((*ret = GDKstrdup(str_nil)) == NULL)
+ throw(MAL, "str.insert", MAL_MALLOC_FAIL);
+ } else {
+ size_t l1 = strlen(*s);
+ size_t l2 = strlen(*s2);
+
+ if (l1 + l2 + 1 >= INT_MAX) {
throw(MAL, "str.insert", MAL_MALLOC_FAIL);
}
- v= *ret = GDKmalloc((int)strlen(*s)+(int)strlen(*s2)+1 );
- strncpy(v, *s,strt);
- v[strt]=0;
- strcat(v,*s2);
- if( strt + *l < (int) strlen(*s))
- strcat(v,*s + strt + *l);
+ if (*l < 0)
+ throw(MAL, "str.insert", ILLEGAL_ARGUMENT);
+ if (strt < 0) {
+ if ((size_t) -strt <= l1)
+ strt = (int) (l1 + strt);
+ else
+ strt = 0;
+ }
+ if ((size_t) strt > l1)
+ strt = (int) l1;
+ v = *ret = GDKmalloc(strlen(*s) + strlen(*s2) + 1);
+ if (v == NULL)
+ throw(MAL, "str.insert", MAL_MALLOC_FAIL);
+ if (strt > 0)
+ strncpy(v, *s, strt);
+ v[strt] = 0;
+ strcpy(v + strt, *s2);
+ if (strt + *l < (int) l1)
+ strcat(v, *s + strt + *l);
}
return MAL_SUCCEED;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list