Skip to content

Commit 95238b2

Browse files
author
Giloo
committed
dealing with string copy of char* and other string lengths when using strncpy.
1 parent 59b5e27 commit 95238b2

File tree

1 file changed

+37
-29
lines changed

1 file changed

+37
-29
lines changed

src/export.hpp

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ DLL_PUBLIC void GDL_CDECL IDL_Deltmp(GDL_REGISTER EXPORT_VPTR v) {
5757
v->value.arr=NULL;
5858
if (v->type == GDL_TYP_STRUCT) {free(v->value.s.sdef);v->value.s.sdef=NULL;}
5959
} else if (v->type == GDL_TYP_STRING) {
60-
if (v->value.str.slen != 0) {free(v->value.str.s);v->value.str.s=NULL;v->value.str.slen=0;}
60+
if (v->value.str.slen != 0 && v->value.str.stype==1) {free(v->value.str.s);v->value.str.s=NULL;v->value.str.slen=0;v->value.str.stype=0;}
6161
}
6262
}
6363
}
@@ -616,7 +616,7 @@ BaseGDL* VPTR_ToGDL(EXPORT_VPTR v, bool protect=false) {
616616
default: GDL_WillThrowAfterCleaning("ReturnEXPORT_VPTR_AsGDL: bad array case.");
617617
}
618618
}
619-
throw;
619+
return NULL;
620620
}
621621
#undef DOCASE
622622
#undef DOCASE_ARRAY
@@ -692,7 +692,7 @@ DLL_PUBLIC EXPORT_VPTR GDL_CDECL IDL_ImportNamedArray(char *name, int n_dim, EX
692692
default:
693693
GDL_WillThrowAfterCleaning("CreateNewGDLArray failure.");
694694
}
695-
throw;
695+
return NULL;
696696
}
697697
#undef DOCASE
698698

@@ -872,9 +872,9 @@ DLL_PUBLIC void GDL_CDECL IDL_PrintF(int argc, EXPORT_VPTR *argv, char *argk) {
872872

873873
DLL_PUBLIC void GDL_CDECL IDL_StrStore(EXPORT_STRING *s, const char *fs){TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
874874
s->slen=strlen(fs);
875-
s->stype=0;
876-
s->s=(char*)malloc(s->slen);
877-
strncpy(s->s,fs,s->slen);
875+
s->stype=1;
876+
s->s=(char*)malloc(s->slen+1);
877+
strncpy(s->s,fs,s->slen+1);
878878
}
879879
DLL_PUBLIC char* GDL_CDECL IDL_VarGetString(EXPORT_VPTR s) {
880880
if (s->type != GDL_TYP_STRING) GDL_WillThrowAfterCleaning("IDL_VarGetString: variable is not a string.");
@@ -893,13 +893,18 @@ DLL_PUBLIC void GDL_CDECL IDL_StrDup(GDL_REGISTER EXPORT_STRING *str, GDL_REGIS
893893
char* news=(char*)malloc(str[i].slen+1);
894894
strncpy(news,str[i].s,str[i].slen+1);
895895
str[i].s=news;
896+
str[i].stype=1;
896897
}
897898
}
898899
}
899900

900901
DLL_PUBLIC void GDL_CDECL IDL_StrDelete(EXPORT_STRING *str, EXPORT_MEMINT n) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
901-
for (auto i=0; i< n; ++i) if (str[i].slen > 0) free(str[i].s);
902+
for (auto i=0; i< n; ++i) {
903+
if (str[i].slen > 0 && str[i].stype==1) free(str[i].s);
904+
str[i].slen=0;
905+
str[i].stype=0;
902906
}
907+
}
903908

904909
// n: The number of characters the string must be able to contain, not including the terminating NULL character.
905910
DLL_PUBLIC void GDL_CDECL IDL_StrEnsureLength(EXPORT_STRING *s, int n) {TRACE_ROUTINE(__FUNCTION__, __FILE__, __LINE__)
@@ -914,9 +919,11 @@ DLL_PUBLIC EXPORT_VPTR GDL_CDECL IDL_StrToSTRING(const char *s) {TRACE_ROUTINE(
914919
EXPORT_VPTR ret = NewTMPVPTR();
915920
ret->type = GDL_TYP_STRING;
916921
ret->flags = GDL_V_TEMP;
917-
ret->value.str.slen = strlen(s);
918-
ret->value.str.stype = 0;
919-
ret->value.str.s=(char*)s;
922+
size_t l=strlen(s);
923+
ret->value.str.slen = l;
924+
ret->value.str.stype = 1;
925+
ret->value.str.s=(char*) malloc(l+1);
926+
strncpy(ret->value.str.s,s,l+1);
920927
return ret;
921928
}
922929

@@ -1022,7 +1029,7 @@ DLL_PUBLIC double GDL_CDECL IDL_DoubleScalar(GDL_REGISTER EXPORT_VPTR v) {TRACE
10221029
DOCASE(double, GDL_TYP_ULONG64, ul64);
10231030
default: GDL_WillThrowAfterCleaning("IDL_DoubleScalar: unexpected type "+i2s(v->type));
10241031
}
1025-
throw;
1032+
return 0;
10261033
}
10271034
DLL_PUBLIC EXPORT_ULONG GDL_CDECL IDL_ULongScalar(GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
10281035
GDL_ENSURE_SIMPLE(v);
@@ -1040,7 +1047,7 @@ DLL_PUBLIC EXPORT_ULONG GDL_CDECL IDL_ULongScalar(GDL_REGISTER EXPORT_VPTR v) {
10401047
DOCASE(EXPORT_ULONG, GDL_TYP_ULONG64, ul64);
10411048
default: GDL_WillThrowAfterCleaning("IDL_ULongScalar: unexpected type "+i2s(v->type));
10421049
}
1043-
throw;
1050+
return 0;
10441051
}
10451052
DLL_PUBLIC EXPORT_LONG GDL_CDECL IDL_LongScalar(GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
10461053
GDL_ENSURE_SIMPLE(v);
@@ -1058,7 +1065,7 @@ DLL_PUBLIC EXPORT_LONG GDL_CDECL IDL_LongScalar(GDL_REGISTER EXPORT_VPTR v) {TR
10581065
DOCASE(EXPORT_LONG, GDL_TYP_ULONG64, ul64);
10591066
default: GDL_WillThrowAfterCleaning("IDL_LongScalar: unexpected type "+i2s(v->type));
10601067
}
1061-
throw;
1068+
return 0;
10621069
}
10631070
DLL_PUBLIC EXPORT_LONG64 GDL_CDECL IDL_Long64Scalar(GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
10641071
GDL_ENSURE_SIMPLE(v);
@@ -1076,7 +1083,7 @@ DLL_PUBLIC EXPORT_LONG64 GDL_CDECL IDL_Long64Scalar(GDL_REGISTER EXPORT_VPTR v)
10761083
DOCASE(EXPORT_LONG64, GDL_TYP_ULONG64, ul64);
10771084
default: GDL_WillThrowAfterCleaning("IDL_Long64Scalar: unexpected type "+i2s(v->type));
10781085
}
1079-
throw;
1086+
return 0;
10801087
}
10811088
DLL_PUBLIC EXPORT_ULONG64 GDL_CDECL IDL_ULong64Scalar(GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
10821089
GDL_ENSURE_SIMPLE(v);
@@ -1094,7 +1101,7 @@ DLL_PUBLIC EXPORT_ULONG64 GDL_CDECL IDL_ULong64Scalar(GDL_REGISTER EXPORT_VPTR
10941101
DOCASE(EXPORT_ULONG64, GDL_TYP_ULONG64, ul64);
10951102
default: GDL_WillThrowAfterCleaning("IDL_ULong64Scalar: unexpected type "+i2s(v->type));
10961103
}
1097-
throw;
1104+
return 0;
10981105
}
10991106
DLL_PUBLIC EXPORT_MEMINT GDL_CDECL IDL_MEMINTScalar(GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
11001107
GDL_ENSURE_SIMPLE(v);
@@ -1112,7 +1119,7 @@ DLL_PUBLIC EXPORT_MEMINT GDL_CDECL IDL_MEMINTScalar(GDL_REGISTER EXPORT_VPTR v)
11121119
DOCASE(EXPORT_MEMINT, GDL_TYP_ULONG64, ul64);
11131120
default: GDL_WillThrowAfterCleaning("IDL_ULong64Scalar: unexpected type "+i2s(v->type));
11141121
}
1115-
throw;
1122+
return 0;
11161123
}
11171124
DLL_PUBLIC EXPORT_FILEINT GDL_CDECL IDL_FILEINTScalar(GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
11181125
GDL_ENSURE_SIMPLE(v);
@@ -1130,7 +1137,7 @@ DLL_PUBLIC EXPORT_FILEINT GDL_CDECL IDL_FILEINTScalar(GDL_REGISTER EXPORT_VPTR
11301137
DOCASE(EXPORT_FILEINT, GDL_TYP_ULONG64, ul64);
11311138
default: GDL_WillThrowAfterCleaning("IDL_ULong64Scalar: unexpected type "+i2s(v->type));
11321139
}
1133-
throw;
1140+
return 0;
11341141
}
11351142
#undef DOCASE
11361143
#undef DOCASE_CMP
@@ -1167,7 +1174,6 @@ void gdlInitVector(void* arr, int type, size_t nelts) {
11671174
DOCASE_ARRAY(GDL_TYP_ULONG64, EXPORT_ULONG64);
11681175
default: GDL_WillThrowAfterCleaning("IDL_MakeTempVector: unexpected type " + i2s(type));
11691176
}
1170-
throw;
11711177
}
11721178
#undef DOCASE_ARRAY
11731179
#undef DOCASE_ARRAY_CPLX
@@ -1189,14 +1195,15 @@ if (init == GDL_ARR_INI_ZERO) memset((void*)addr, 0, l);
11891195
else if (init == GDL_ARR_INI_INDEX) {
11901196
if (type == GDL_TYP_STRING) {
11911197
EXPORT_LONG64 nelts=v->value.arr->n_elts;
1192-
static int slen = IDL_OutputFormatLenFunc(GDL_TYP_LONG)+1;
1198+
static int slen = IDL_OutputFormatLenFunc(GDL_TYP_LONG);
11931199
// allocate size:
1194-
char* allstrings = (char*)malloc(nelts * slen);
1200+
char* allstrings = (char*)malloc(nelts * (slen+1));
11951201
EXPORT_STRING *thestrings = (EXPORT_STRING *) v->value.arr->data;
1202+
char* fmt=IDL_OutputFormatFunc(GDL_TYP_LONG);
11961203
for (auto i = 0; i < nelts; ++i) {
11971204
thestrings[i].slen = slen;
1198-
thestrings[i].s = &(allstrings[i * slen]);
1199-
snprintf(thestrings[i].s,IDL_OutputFormatLenFunc(GDL_TYP_LONG), IDL_OutputFormatFunc(GDL_TYP_LONG), i);
1205+
thestrings[i].s = &(allstrings[i * (slen+1)]);
1206+
snprintf(thestrings[i].s,slen+1, fmt, i);
12001207
}
12011208
} else gdlInitVector(addr, type, l);
12021209
}
@@ -1242,14 +1249,15 @@ if (init == GDL_ARR_INI_ZERO) memset((void*)addr, 0, l);
12421249
else if (init == GDL_ARR_INI_INDEX) {
12431250
if (type == GDL_TYP_STRING) {
12441251
EXPORT_LONG64 nelts=v->value.arr->n_elts;
1245-
static int slen = IDL_OutputFormatLenFunc(GDL_TYP_LONG)+1;
1252+
static int slen = IDL_OutputFormatLenFunc(GDL_TYP_LONG);
12461253
// allocate size:
1247-
char* allstrings = (char*)malloc(nelts * slen);
1254+
char* allstrings = (char*)malloc(nelts * (slen+1));
12481255
EXPORT_STRING *thestrings = (EXPORT_STRING *) v->value.arr->data;
1256+
char* fmt=IDL_OutputFormatFunc(GDL_TYP_LONG);
12491257
for (auto i = 0; i < nelts; ++i) {
12501258
thestrings[i].slen = slen;
1251-
thestrings[i].s = &(allstrings[i * slen]);
1252-
snprintf(thestrings[i].s, IDL_OutputFormatLenFunc(GDL_TYP_LONG), IDL_OutputFormatFunc(GDL_TYP_LONG), i);
1259+
thestrings[i].s = &(allstrings[i * (slen+1)]);
1260+
snprintf(thestrings[i].s, slen+1, fmt, i);
12531261
}
12541262
} else gdlInitVector(addr, type, l);
12551263
}
@@ -1295,7 +1303,7 @@ if (t->flags & GDL_V_ARR) {
12951303
if (zero) memset(&(v->value),0,sizeof(EXPORT_ALLTYPES));
12961304
return (char*) &(v->value);
12971305
}
1298-
throw;
1306+
return NULL;
12991307
}
13001308

13011309
DLL_PUBLIC EXPORT_VPTR GDL_CDECL IDL_Gettmp(void){TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
@@ -2379,15 +2387,15 @@ DLL_PUBLIC void * GDL_CDECL IDL_MemRealloc(void *ptr, EXPORT_MEMINT n, const cha
23792387

23802388
DLL_PUBLIC void GDL_CDECL IDL_MemFree(GDL_REGISTER void *m, const char *err_str, int msg_action){free(m);}
23812389

2382-
DLL_PUBLIC void * GDL_CDECL IDL_MemAllocPerm(EXPORT_MEMINT n, const char *err_str, int action){TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__) GDL_WillThrowAfterCleaning("MemAllocPerm is not currently supported.");throw;}
2390+
DLL_PUBLIC void * GDL_CDECL IDL_MemAllocPerm(EXPORT_MEMINT n, const char *err_str, int action){TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__) GDL_WillThrowAfterCleaning("MemAllocPerm is not currently supported.");return NULL;}
23832391

23842392
DLL_PUBLIC char * GDL_CDECL IDL_GetScratch(GDL_REGISTER EXPORT_VPTR *p, GDL_REGISTER EXPORT_MEMINT n_elts, GDL_REGISTER EXPORT_MEMINT elt_size){ TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__) return (char*)malloc (n_elts*elt_size);}
23852393

23862394
DLL_PUBLIC void GDL_CDECL GDL_KWCleanup(int fcn){TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__) IDL_KWFree();}
23872395

23882396
DLL_PUBLIC char * GDL_CDECL IDL_GetScratchOnThreshold(GDL_REGISTER char *auto_buf, GDL_REGISTER EXPORT_MEMINT auto_elts, GDL_REGISTER EXPORT_MEMINT n_elts, GDL_REGISTER EXPORT_MEMINT elt_size, EXPORT_VPTR *tempvar){TRACE_ROUTINE(__FUNCTION__,__FILE__,__LINE__)
23892397
GDL_WillThrowAfterCleaning("IDL_GetScratchOnThreshold is not implemented, FIXME.");
2390-
throw;
2398+
return NULL;
23912399
}
23922400

23932401
EXPORT_TERMINFO IDL_TermInfo={

0 commit comments

Comments
 (0)