Skip to content
Snippets Groups Projects
Commit 0bab1f50 authored by Jonathan Schöbel's avatar Jonathan Schöbel
Browse files

NodeFragment: added unsafe getter for tag

The library provides a way to directly access the tag in a read-only
way, which saves an call to strdup. This is useful if only reading is
necessary , but needs special care by developers, as it is neither
allowed to modify it nor to free it. Disregarding this will lead to a
segfault in the best, and to silent data corruption and security bugs in
the worst case.
parent 85710343
No related branches found
No related tags found
No related merge requests found
......@@ -28,7 +28,7 @@ long_line_behaviour=1
long_line_column=72
[files]
current_page=21
current_page=27
FILE_NAME_0=923;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fconfigure.ac;0;8
FILE_NAME_1=73;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2FMakefile.am;0;8
FILE_NAME_2=1143;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Fmain.c;0;8
......@@ -41,7 +41,7 @@ FILE_NAME_8=1185;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fpr
FILE_NAME_9=916;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment.h;0;8
FILE_NAME_10=1975;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment_data.c;0;8
FILE_NAME_11=2173;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment_class.c;0;8
FILE_NAME_12=8225;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8
FILE_NAME_12=7399;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8
FILE_NAME_13=931;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.h;0;8
FILE_NAME_14=25820;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ftext.c;0;8
FILE_NAME_15=904;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ftext.h;0;8
......@@ -56,7 +56,7 @@ FILE_NAME_23=1078;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
FILE_NAME_24=290;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8
FILE_NAME_25=1085;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8
FILE_NAME_26=3283;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8
FILE_NAME_27=13617;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8
FILE_NAME_27=15178;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8
FILE_NAME_28=11068;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8
FILE_NAME_29=5744;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
FILE_NAME_30=165;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
......@@ -71,6 +71,7 @@ ignored_dirs_patterns=.*;CVS;
ignored_file_patterns=*.o;*.obj;*.a;*.lib;*.so;*.dll;*.lo;*.la;*.class;*.jar;*.pyc;*.mo;*.gmo;
generate_tag_prefs=0
external_dirs=
show_empty_dirs=true
[build-menu]
NF_00_LB=_Make
......
......@@ -46,7 +46,7 @@ struct SH_NodeFragment
{
struct SH_Fragment base;
char * tag;
/*@only@*/ char * tag;
size_t child_n;
struct SH_Fragment ** childs;
......@@ -123,6 +123,40 @@ SH_NodeFragment_new (const char * tag,
return (struct SH_Fragment *) fragment;
}
/*@null@*/
/*@only@*/
struct SH_Fragment /*@alt struct SH_NodeFragment@*/ *
SH_NodeFragment_raw_new (/*@only@*/ char * tag,
/*@dependent@*/ SH_Data * data,
/*@out@*/ /*@null@*/ struct SH_Status * status)
/*@globals NODE,
fileSystem@*/
/*@modifies fileSystem@*/
/*@modifies status@*/
{
struct SH_NodeFragment * fragment;
fragment = malloc (sizeof (struct SH_NodeFragment));
if (fragment == NULL)
{
set_status (status, E_ALLOC, 3,
"Memory allocation for "
"SH_NodeFragment failed.\n");
return NULL;
}
init_fragment (&(fragment->base), data, NODE, &methods);
fragment->tag = tag;
fragment->child_n = 0;
fragment->childs = malloc (0);
set_success (status);
return (struct SH_Fragment *) fragment;
}
void
SH_NodeFragment_free (/*@only@*/ struct SH_NodeFragment * fragment)
/*@modifies fragment@*/
......@@ -276,6 +310,15 @@ SH_Fragment_is_NodeFragment (const struct SH_Fragment * fragment)
return get_type (fragment) == NODE;
}
static inline
/*@observer@*/
char *
get_tag (const struct SH_NodeFragment * fragment)
/*@*/
{
return fragment->tag;
}
/*@null@*/
/*@only@*/
char *
......@@ -287,7 +330,7 @@ SH_NodeFragment_get_tag (const struct SH_NodeFragment * fragment,
{
char * tag;
tag = strdup (fragment->tag);
tag = strdup (get_tag (fragment));
if (tag == NULL)
{
......@@ -303,6 +346,13 @@ SH_NodeFragment_get_tag (const struct SH_NodeFragment * fragment,
return tag;
}
/*@observer@*/
char *
SH_NodeFragment_raw_get_tag (const struct SH_NodeFragment * fragment)
{
return get_tag (fragment);
}
/*@null@*/
/*@observer@*/
struct SH_Fragment *
......
......@@ -63,6 +63,38 @@ START_TEST(test_node_fragment)
}
END_TEST
START_TEST(test_node_fragment_raw_new)
{
struct SH_Status status;
struct SH_Fragment * fragment;
struct SH_Data * data;
char * tag1 = strdup ("tag");
char * tag2 = strdup ("tag");
data = SH_Data_new (NULL);
/* valid tag - no error */
fragment = SH_NodeFragment_raw_new (tag1, data, NULL);
ck_assert_int_ne ((long int) fragment, (long int) NULL);
ck_assert_ptr_eq (((struct SH_NodeFragment *) fragment)->tag, tag1);
SH_Fragment_free (fragment);
/* valid tag - error */
_status_preinit (status);
fragment = SH_NodeFragment_raw_new (tag2, data, &status);
ck_assert_int_ne ((long int) fragment, (long int) NULL);
ck_assert_int_eq (status.status, SUCCESS);
ck_assert_ptr_eq (((struct SH_NodeFragment *) fragment)->tag, tag2);
SH_Fragment_free (fragment);
SH_Data_free (data);
}
END_TEST
START_TEST(test_node_fragment_copy)
{
struct SH_Status status;
......@@ -224,6 +256,9 @@ START_TEST(test_node_fragment_tag)
/* no error */
fragment = SH_NodeFragment_new (tag1, data, NULL);
tag = SH_NodeFragment_raw_get_tag (((struct SH_NodeFragment *) fragment));
ck_assert_str_eq (tag, tag1);
tag = SH_NodeFragment_get_tag (((struct SH_NodeFragment *) fragment),
NULL);
ck_assert_str_eq (tag, tag1);
......@@ -497,6 +532,7 @@ Suite * fragment_suite (void)
tc_core = tcase_create ("Core");
tcase_add_test (tc_core, test_node_fragment);
tcase_add_test (tc_core, test_node_fragment_raw_new);
tcase_add_test (tc_core, test_node_fragment_copy);
tcase_add_test (tc_core, test_node_fragment_deepcopy);
tcase_add_test (tc_core, test_node_fragment_tag);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment