diff --git a/src/libisofs.h b/src/libisofs.h index bda1e8d..e2617e5 100644 --- a/src/libisofs.h +++ b/src/libisofs.h @@ -316,8 +316,13 @@ enum IsoNodeType iso_node_get_type(IsoNode *node); * Set the name of a node. Note that if the node is already added to a dir * this can fail if dir already contains a node with the new name. * + * @param node + * The node whose name you want to change. Note that you can't change + * the name of the root. * @param name - * The name in UTF-8 encoding + * The name in UTF-8 encoding. If you supply an empty string or a + * name greater than 255 characters this returns with failure, and + * node name is not modified. * @return * 1 on success, < 0 on error */ @@ -614,6 +619,10 @@ const char *iso_symlink_get_dest(const IsoSymlink *link); /** * Set the destination of a link. + * + * @param dest + * New destination for the link. It must be a non-empty string, otherwise + * this function doesn't modify previous destination. */ void iso_symlink_set_dest(IsoSymlink *link, const char *dest); diff --git a/src/node.c b/src/node.c index 7ee11c6..bd4bbdf 100644 --- a/src/node.c +++ b/src/node.c @@ -79,20 +79,27 @@ enum IsoNodeType iso_node_get_type(IsoNode *node) int iso_node_set_name(IsoNode *node, const char *name) { char *new; - if (node->parent != NULL) { - /* check if parent already has a node with same name */ - if (iso_dir_get_node(node->parent, name, NULL) == 1) { - return ISO_NODE_NAME_NOT_UNIQUE; - } - } + /* guard against the empty string */ - if (name[0] == '\0') { + if (name[0] == '\0' || strlen(name) > 255) { return ISO_WRONG_ARG_VALUE; } + if ((IsoNode*)node->parent == node) { + /* you can't change name of the root node */ + return ISO_WRONG_ARG_VALUE; + } + new = strdup(name); if (new == NULL) { return ISO_MEM_ERROR; } + if (node->parent != NULL) { + /* check if parent already has a node with same name */ + if (iso_dir_get_node(node->parent, name, NULL) == 1) { + free(new); + return ISO_NODE_NAME_NOT_UNIQUE; + } + } free(node->name); node->name = new; if (node->parent != NULL) { @@ -537,6 +544,10 @@ const char *iso_symlink_get_dest(const IsoSymlink *link) */ void iso_symlink_set_dest(IsoSymlink *link, const char *dest) { + if (dest == NULL || dest[0] == '\0') { + /* guard against null or empty dest */ + return; + } free(link->dest); link->dest = strdup(dest); }