Ensure names of public tree IsoNodes are valid POSIX names.
This commit is contained in:
parent
aec6c8ce69
commit
1459801134
58
src/node.c
58
src/node.c
@ -80,37 +80,27 @@ int iso_node_set_name(IsoNode *node, const char *name)
|
|||||||
{
|
{
|
||||||
char *new;
|
char *new;
|
||||||
|
|
||||||
/* guard against the empty string or big names... */
|
|
||||||
if (name[0] == '\0' || strlen(name) > 255) {
|
|
||||||
return ISO_WRONG_ARG_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ...against "." and ".." names... */
|
|
||||||
if (!strcmp(name, ".") || !strcmp(name, "..")) {
|
|
||||||
return ISO_WRONG_ARG_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ...and against names with '/' */
|
|
||||||
if (strchr(name, '/') != NULL) {
|
|
||||||
return ISO_WRONG_ARG_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((IsoNode*)node->parent == node) {
|
if ((IsoNode*)node->parent == node) {
|
||||||
/* you can't change name of the root node */
|
/* you can't change name of the root node */
|
||||||
return ISO_WRONG_ARG_VALUE;
|
return ISO_WRONG_ARG_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
new = strdup(name);
|
/* check if the name is valid */
|
||||||
if (new == NULL) {
|
if (!iso_node_is_valid_name(name)) {
|
||||||
return ISO_MEM_ERROR;
|
return ISO_WRONG_ARG_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->parent != NULL) {
|
if (node->parent != NULL) {
|
||||||
/* check if parent already has a node with same name */
|
/* check if parent already has a node with same name */
|
||||||
if (iso_dir_get_node(node->parent, name, NULL) == 1) {
|
if (iso_dir_get_node(node->parent, name, NULL) == 1) {
|
||||||
free(new);
|
|
||||||
return ISO_NODE_NAME_NOT_UNIQUE;
|
return ISO_NODE_NAME_NOT_UNIQUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new = strdup(name);
|
||||||
|
if (new == NULL) {
|
||||||
|
return ISO_MEM_ERROR;
|
||||||
|
}
|
||||||
free(node->name);
|
free(node->name);
|
||||||
node->name = new;
|
node->name = new;
|
||||||
if (node->parent != NULL) {
|
if (node->parent != NULL) {
|
||||||
@ -595,6 +585,36 @@ int iso_file_get_sort_weight(IsoFile *file)
|
|||||||
return file->sort_weight;
|
return file->sort_weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a given name is valid for an iso node.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* 1 if yes, 0 if not
|
||||||
|
*/
|
||||||
|
int iso_node_is_valid_name(const char *name)
|
||||||
|
{
|
||||||
|
/* a name can't be NULL */
|
||||||
|
if (name == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* guard against the empty string or big names... */
|
||||||
|
if (name[0] == '\0' || strlen(name) > 255) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ...against "." and ".." names... */
|
||||||
|
if (!strcmp(name, ".") || !strcmp(name, "..")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ...and against names with '/' */
|
||||||
|
if (strchr(name, '/') != NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int iso_node_new_root(IsoDir **root)
|
int iso_node_new_root(IsoDir **root)
|
||||||
{
|
{
|
||||||
IsoDir *dir;
|
IsoDir *dir;
|
||||||
|
@ -107,4 +107,12 @@ struct Iso_Dir_Iter
|
|||||||
|
|
||||||
int iso_node_new_root(IsoDir **root);
|
int iso_node_new_root(IsoDir **root);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a given name is valid for an iso node.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* 1 if yes, 0 if not
|
||||||
|
*/
|
||||||
|
int iso_node_is_valid_name(const char *name);
|
||||||
|
|
||||||
#endif /*LIBISO_NODE_H_*/
|
#endif /*LIBISO_NODE_H_*/
|
||||||
|
15
src/tree.c
15
src/tree.c
@ -57,6 +57,11 @@ int iso_tree_add_new_dir(IsoDir *parent, const char *name, IsoDir **dir)
|
|||||||
*dir = NULL;
|
*dir = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if the name is valid */
|
||||||
|
if (!iso_node_is_valid_name(name)) {
|
||||||
|
return ISO_WRONG_ARG_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* find place where to insert */
|
/* find place where to insert */
|
||||||
pos = &(parent->children);
|
pos = &(parent->children);
|
||||||
while (*pos != NULL && strcmp((*pos)->name, name) < 0) {
|
while (*pos != NULL && strcmp((*pos)->name, name) < 0) {
|
||||||
@ -141,6 +146,11 @@ int iso_tree_add_new_symlink(IsoDir *parent, const char *name,
|
|||||||
*link = NULL;
|
*link = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if the name is valid */
|
||||||
|
if (!iso_node_is_valid_name(name)) {
|
||||||
|
return ISO_WRONG_ARG_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* find place where to insert */
|
/* find place where to insert */
|
||||||
pos = &(parent->children);
|
pos = &(parent->children);
|
||||||
while (*pos != NULL && strcmp((*pos)->name, name) < 0) {
|
while (*pos != NULL && strcmp((*pos)->name, name) < 0) {
|
||||||
@ -249,6 +259,11 @@ int iso_tree_add_new_special(IsoDir *parent, const char *name, mode_t mode,
|
|||||||
*special = NULL;
|
*special = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if the name is valid */
|
||||||
|
if (!iso_node_is_valid_name(name)) {
|
||||||
|
return ISO_WRONG_ARG_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* find place where to insert */
|
/* find place where to insert */
|
||||||
pos = &(parent->children);
|
pos = &(parent->children);
|
||||||
while (*pos != NULL && strcmp((*pos)->name, name) < 0) {
|
while (*pos != NULL && strcmp((*pos)->name, name) < 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user