Skip to content

Commit d555ed1

Browse files
FreddieAkeroydFreddie Akeroyd
authored and
Freddie Akeroyd
committed
Add optional name syntax checking via NXACC_CHECKNAMESYNTAX flag
refs nexusformat#301 git-svn-id: https://svn.nexusformat.org/code/trunk@1747 ff5d1e40-2be0-497f-93bd-dc18237bd3c7
1 parent 953f08f commit d555ed1

File tree

3 files changed

+55
-11
lines changed

3 files changed

+55
-11
lines changed

include/napi.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ typedef char NXname[128];
9696
* \li NXACC_CREATE4 create a NeXus HDF-4 file
9797
* \li NXACC_CREATE5 create a NeXus HDF-5 file.
9898
* \li NXACC_CREATEXML create a NeXus XML file.
99+
* \li NXACC_CHECKNAMESYNTAX Check names conform to NeXus allowed characters.
99100
*/
100101
typedef enum {NXACC_READ=1, NXACC_RDWR=2, NXACC_CREATE=3, NXACC_CREATE4=4,
101-
NXACC_CREATE5=5, NXACC_CREATEXML=6, NXACC_TABLE=8, NXACC_NOSTRIP=128} NXaccess_mode;
102+
NXACC_CREATE5=5, NXACC_CREATEXML=6, NXACC_TABLE=8, NXACC_NOSTRIP=128, NXACC_CHECKNAMESYNTAX=256 } NXaccess_mode;
102103

103104
/**
104105
* A combination of options from #NXaccess_mode
@@ -895,7 +896,6 @@ extern NXstatus NXsetcache(long newVal);
895896

896897
typedef struct {
897898
NXhandle pNexusData;
898-
int stripFlag;
899899
NXstatus ( *nxreopen)(NXhandle pOrigHandle, NXhandle* pNewHandle);
900900
NXstatus ( *nxclose)(NXhandle* pHandle);
901901
NXstatus ( *nxflush)(NXhandle* pHandle);
@@ -930,6 +930,8 @@ extern NXstatus NXsetcache(long newVal);
930930
NXstatus ( *nxnativeexternallink)(NXhandle handle, CONSTCHAR* name, CONSTCHAR* externalfile, CONSTCHAR* remotetarget);
931931
NXstatus ( *nxnativeinquirefile)(NXhandle handle, char* externalfile, const int filenamelength);
932932
NXstatus ( *nxnativeisexternallink)(NXhandle handle, CONSTCHAR* name, char* url, int urllen);
933+
int stripFlag;
934+
int checkNameSyntax;
933935
} NexusFunction, *pNexusFunction;
934936
/*---------------------*/
935937
extern long nx_cacheSize;

src/napi.c

+39-4
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ static int nxiunlock(int ret)
142142
/**
143143
* valid NeXus names
144144
*/
145-
int validNXName(const char* name)
145+
int validNXName(const char* name, int allow_colon)
146146
{
147147
int i;
148148
if (name == NULL)
@@ -158,6 +158,10 @@ int validNXName(const char* name)
158158
{
159159
;
160160
}
161+
else if (allow_colon && name[i] == ':')
162+
{
163+
;
164+
}
161165
else
162166
{
163167
return 0;
@@ -490,6 +494,12 @@ static NXstatus NXinternalopenImpl(CONSTCHAR *userfilename, NXaccess am, pFile
490494
fHandle->stripFlag = 0;
491495
am = (NXaccess)(am & ~NXACC_NOSTRIP);
492496
}
497+
fHandle->checkNameSyntax = 0;
498+
if (am & NXACC_CHECKNAMESYNTAX) {
499+
fHandle->checkNameSyntax = 1;
500+
am = (NXaccess)(am & ~NXACC_CHECKNAMESYNTAX);
501+
}
502+
493503

494504
if (my_am==NXACC_CREATE) {
495505
/* HDF4 will be used ! */
@@ -684,7 +694,7 @@ NXstatus NXreopen(NXhandle pOrigHandle, NXhandle* pNewHandle)
684694
{
685695
char buffer[256];
686696
pNexusFunction pFunc = handleToNexusFunc(fid);
687-
if ( (nxclass != NULL) && !strncmp("NX", nxclass, 2) && !validNXName(name) )
697+
if ( pFunc->checkNameSyntax && (nxclass != NULL) /* && !strncmp("NX", nxclass, 2) */ && !validNXName(name, 0) )
688698
{
689699
sprintf(buffer, "ERROR: invalid characters in group name \"%s\"", name);
690700
NXReportError(buffer);
@@ -821,7 +831,14 @@ static int analyzeNapimount(char *napiMount, char *extFile, int extFileLen,
821831
NXstatus NXmakedata64 (NXhandle fid, CONSTCHAR *name, int datatype,
822832
int rank, int64_t dimensions[])
823833
{
834+
char buffer[256];
824835
pNexusFunction pFunc = handleToNexusFunc(fid);
836+
if ( pFunc->checkNameSyntax && !validNXName(name, 0) )
837+
{
838+
sprintf(buffer, "ERROR: invalid characters in dataset name \"%s\"", name);
839+
NXReportError(buffer);
840+
return NX_ERROR;
841+
}
825842
return LOCKED_CALL(pFunc->nxmakedata64(pFunc->pNexusData, name, datatype, rank, dimensions));
826843
}
827844

@@ -842,7 +859,14 @@ static int analyzeNapimount(char *napiMount, char *extFile, int extFileLen,
842859
NXstatus NXcompmakedata64 (NXhandle fid, CONSTCHAR *name, int datatype,
843860
int rank, int64_t dimensions[], int compress_type, int64_t chunk_size[])
844861
{
862+
char buffer[256];
845863
pNexusFunction pFunc = handleToNexusFunc(fid);
864+
if ( pFunc->checkNameSyntax && !validNXName(name, 0) )
865+
{
866+
sprintf(buffer, "ERROR: invalid characters in dataset name \"%s\"", name);
867+
NXReportError(buffer);
868+
return NX_ERROR;
869+
}
846870
return LOCKED_CALL(pFunc->nxcompmakedata64 (pFunc->pNexusData, name, datatype, rank, dimensions, compress_type, chunk_size));
847871
}
848872

@@ -944,16 +968,20 @@ static int analyzeNapimount(char *napiMount, char *extFile, int extFileLen,
944968
NXstatus NXputattr (NXhandle fid, CONSTCHAR *name, void *data,
945969
int datalen, int iType)
946970
{
971+
char buffer[256];
947972
pNexusFunction pFunc = handleToNexusFunc(fid);
948973
if (datalen > 1 && iType != NX_CHAR)
949974
{
950975
NXReportError("NXputattr: numeric arrays are not allowed as attributes - only character strings and single numbers");
951976
return NX_ERROR;
952977
}
953-
else
978+
if ( pFunc->checkNameSyntax && !validNXName(name, 0) )
954979
{
955-
return LOCKED_CALL(pFunc->nxputattr(pFunc->pNexusData, name, data, datalen, iType));
980+
sprintf(buffer, "ERROR: invalid characters in attribute name \"%s\"", name);
981+
NXReportError(buffer);
982+
return NX_ERROR;
956983
}
984+
return LOCKED_CALL(pFunc->nxputattr(pFunc->pNexusData, name, data, datalen, iType));
957985
}
958986

959987
/* ------------------------------------------------------------------- */
@@ -1000,7 +1028,14 @@ static int analyzeNapimount(char *napiMount, char *extFile, int extFileLen,
10001028

10011029
NXstatus NXmakenamedlink (NXhandle fid, CONSTCHAR *newname, NXlink* sLink)
10021030
{
1031+
char buffer[256];
10031032
pNexusFunction pFunc = handleToNexusFunc(fid);
1033+
if ( pFunc->checkNameSyntax && !validNXName(newname, 0) )
1034+
{
1035+
sprintf(buffer, "ERROR: invalid characters in link name \"%s\"", newname);
1036+
NXReportError(buffer);
1037+
return NX_ERROR;
1038+
}
10041039
return LOCKED_CALL(pFunc->nxmakenamedlink(pFunc->pNexusData, newname, sLink));
10051040
}
10061041
/* --------------------------------------------------------------------*/

src/nxxml.c

+12-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636

3737
extern void *NXpData;
38-
extern int validNXName(const char* name); /* from napi.c */
38+
extern int validNXName(const char* name, int allow_colon); /* from napi.c */
3939
char *nxitrim(char *str); /* from napi.c */
4040

4141
/*----------------------- our data structures --------------------------
@@ -258,7 +258,7 @@ NXstatus NXXmakegroup (NXhandle fid, CONSTCHAR *name,
258258
xmlHandle = (pXMLNexus)fid;
259259
assert(xmlHandle);
260260

261-
if (!validNXName(name))
261+
if (!validNXName(name, 0))
262262
{
263263
sprintf(buffer, "ERROR: invalid characters in group name \"%s\"", name);
264264
NXReportError(buffer);
@@ -427,7 +427,7 @@ NXstatus NXXmakedatatable64 (NXhandle fid,
427427

428428
xmlHandle = (pXMLNexus)fid;
429429
assert(xmlHandle);
430-
if (!validNXName(name))
430+
if (!validNXName(name, 0))
431431
{
432432
sprintf(buffer, "ERROR: invalid characters in dataset name \"%s\"", name);
433433
NXReportError(buffer);
@@ -505,7 +505,7 @@ NXstatus NXXmakedata64 (NXhandle fid,
505505

506506
xmlHandle = (pXMLNexus)fid;
507507
assert(xmlHandle);
508-
if (!validNXName(name))
508+
if (!validNXName(name, 0))
509509
{
510510
sprintf(buffer, "ERROR: invalid characters in dataset name \"%s\"", name);
511511
NXReportError(buffer);
@@ -1288,12 +1288,19 @@ static char *formatAttributeData(void *data, int datalen, int iType){
12881288
/*---------------------------------------------------------------------*/
12891289
NXstatus NXXputattr (NXhandle fid, CONSTCHAR *name, void *data,
12901290
int datalen, int iType){
1291+
char buffer[256];
12911292
pXMLNexus xmlHandle = NULL;
12921293
mxml_node_t *current = NULL;
12931294
char *numberData = NULL;
12941295

12951296
xmlHandle = (pXMLNexus)fid;
12961297
assert(xmlHandle);
1298+
if (!validNXName(name, 1))
1299+
{
1300+
sprintf(buffer, "ERROR: invalid characters in attribute name \"%s\"", name);
1301+
NXReportError(buffer);
1302+
return NX_ERROR;
1303+
}
12971304

12981305
current = xmlHandle->stack[xmlHandle->stackPointer].current;
12991306
if(isDataNode(xmlHandle->stack[xmlHandle->stackPointer].current)){
@@ -1895,7 +1902,7 @@ NXstatus NXXmakenamedlink (NXhandle fid, CONSTCHAR *name, NXlink* sLink){
18951902

18961903
xmlHandle = (pXMLNexus)fid;
18971904
assert(xmlHandle);
1898-
if (!validNXName(name))
1905+
if (!validNXName(name, 0))
18991906
{
19001907
sprintf(buffer, "ERROR: invalid characters in link name \"%s\"", name);
19011908
NXReportError(buffer);

0 commit comments

Comments
 (0)