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

Attr: added unsafe getter & setter for value

When used with care, it is possible to bypass many strdup calls.
parent 73b5c745
No related branches found
No related tags found
No related merge requests found
......@@ -43,8 +43,8 @@ FILE_NAME_10=2022;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
FILE_NAME_11=2558;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=2167;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=5930;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=4656;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.c;0;8
FILE_NAME_15=2396;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.h;0;8
FILE_NAME_14=6164;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.c;0;8
FILE_NAME_15=2924;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.h;0;8
FILE_NAME_16=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_17=904;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ftext.h;0;8
FILE_NAME_18=1779;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator.c;0;8
......@@ -59,7 +59,7 @@ FILE_NAME_26=533;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2
FILE_NAME_27=1085;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8
FILE_NAME_28=3283;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8
FILE_NAME_29=8770;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8
FILE_NAME_30=8277;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8
FILE_NAME_30=12246;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8
FILE_NAME_31=11068;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8
FILE_NAME_32=5744;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
FILE_NAME_33=165;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
......
......@@ -249,6 +249,28 @@ SH_Attr_raw_set_name (struct SH_Attr * attr, /*@only@*/ char * name)
return;
}
static inline
/*@null@*/
/*@observer@*/
char *
get_value (const struct SH_Attr * attr)
{
return attr->value;
}
static inline
void
set_value (struct SH_Attr * attr, /*@null@*/ /*@only@*/ char * value)
{
if (NULL != attr->value)
{
free (attr->value);
}
attr->value = value;
return;
}
/*@null@*/
/*@only@*/
char *
......@@ -258,13 +280,13 @@ SH_Attr_get_value (const struct SH_Attr * attr,
{
char * value;
if (NULL == attr->value)
if (NULL == get_value (attr))
{
set_success (status);
return NULL;
}
value = strdup (attr->value);
value = strdup (get_value (attr));
if (NULL == value)
{
set_status (status, E_ALLOC, 3, "strdup failed");
......@@ -277,7 +299,7 @@ SH_Attr_get_value (const struct SH_Attr * attr,
bool
SH_Attr_set_value (struct SH_Attr * attr,
const char * value,
/*@null@*/ const char * value,
/*@null@*/ /*@out@*/ struct SH_Status * status)
/*@modifies attr->value@*/
{
......@@ -297,13 +319,26 @@ SH_Attr_set_value (struct SH_Attr * attr,
}
}
if (NULL != attr->value)
{
free (attr->value);
}
attr->value = value_copy;
set_value (attr, value_copy);
set_success (status);
return TRUE;
}
/*@null@*/
/*@observer@*/
char *
SH_Attr_raw_get_value (const struct SH_Attr * attr)
/*@*/
{
return get_value (attr);
}
void
SH_Attr_raw_set_value (struct SH_Attr * attr,
/*@null@*/ /*@only@*/ char * value)
/*@modifies attr->value@*/
{
set_value (attr, value);
return;
}
......@@ -106,4 +106,15 @@ SH_Attr_set_value (SH_Attr * attr,
/*@null@*/ /*@out@*/ struct SH_Status * status)
/*@modifies attr@*/;
/*@null@*/
/*@observer@*/
char *
SH_Attr_raw_get_value (const SH_Attr * attr)
/*@*/;
void
SH_Attr_raw_set_value (SH_Attr * attr,
/*@null@*/ /*@only@*/ char * value)
/*@modifies attr@*/;
#endif /* SEFHT_ATTR_H */
......@@ -436,6 +436,35 @@ START_TEST(test_attr_value_with_status)
}
END_TEST
START_TEST(test_attr_value_raw)
{
struct SH_Attr * attr;
char * name = strdup ("name");
char * value1 = strdup ("value1");
char * value2 = strdup ("value2");
const char * value;
attr = SH_Attr_raw_new (name, NULL, NULL);
ck_assert_ptr_ne (NULL, attr);
ck_assert_ptr_eq (NULL, attr->value);
value = SH_Attr_raw_get_value (attr);
ck_assert_ptr_eq (NULL, value);
SH_Attr_raw_set_value (attr, value1);
ck_assert_ptr_eq (value1, attr->value);
value = SH_Attr_raw_get_value (attr);
ck_assert_ptr_ne (NULL, value);
ck_assert_ptr_eq (value1, value);
SH_Attr_raw_set_value (attr, value2);
ck_assert_ptr_eq (value2, attr->value);
SH_Attr_free (attr);
}
END_TEST
Suite * test_suite (void)
{
Suite *s;
......@@ -467,6 +496,7 @@ Suite * test_suite (void)
tcase_add_test (tc_core, test_attr_value_no_status);
tcase_add_test (tc_core, test_attr_value_with_status);
tcase_add_test (tc_core, test_attr_value_raw);
suite_add_tcase (s, tc_core);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment