Commit 8816284f authored by Kevin Wolf's avatar Kevin Wolf
Browse files

68: Zwei Verzeichniseinträge mit demselben Namen verhindern


Bevor ein neuer Verzeichniseintrag angelegt wird, sollten wir erst
einmal schauen, ob in diesem Verzeichnis nicht schon einer mit demselben
Namen existiert.
Signed-off-by: Kevin Wolf's avatarKevin Wolf <kevin@tyndur.org>
parent 0a29d5d6
No related merge requests found
Showing with 99 additions and 8 deletions
+99 -8
......@@ -38,7 +38,7 @@
#include <stdio.h>
struct private_dir_get {
char* name;
const char* name;
size_t name_len;
ext2_dirent_t* result;
int found;
......@@ -88,7 +88,7 @@ static int dir_get_handler(ext2_dirent_t* dirent, void* prv)
return 0;
}
ext2_dirent_t* ext2_dir_get(ext2_inode_t* inode, char* name)
ext2_dirent_t* ext2_dir_get(ext2_inode_t* inode, const char* name)
{
struct private_dir_get prv = {
.name = name,
......@@ -173,6 +173,13 @@ int ext2_dir_link(ext2_inode_t* dir, ext2_inode_t* inode, const char* name)
type = ext2_inode_type(inode);
}
/* Don't create a second dir entry with the same name */
entry = ext2_dir_get(dir, name);
if (entry != NULL) {
free(entry);
return 0;
}
if (dir->raw->size) {
ext2_inode_readdata(dir, 0, dir->raw->size, buf);
while (dir->raw->size && (pos < dir->raw->size)) {
......@@ -302,8 +309,10 @@ int ext2_dir_create(ext2_inode_t* parent, const char* name, ext2_inode_t* newi)
newi->raw->mode = EXT2_INODE_MODE_DIR | 0777;
// Verzeichniseintraege anlegen
if (!ext2_dir_link(parent, newi, name) ||
!ext2_dir_link(newi, newi, ".") ||
if (!ext2_dir_link(parent, newi, name)) {
goto fail;
}
if (!ext2_dir_link(newi, newi, ".") ||
!ext2_dir_link(newi, parent, ".."))
{
return 0;
......@@ -321,5 +330,9 @@ int ext2_dir_create(ext2_inode_t* parent, const char* name, ext2_inode_t* newi)
ext2_bg_update(parent->fs, bgnum, &bg);
return 1;
fail:
ext2_inode_free(newi);
return 0;
}
......@@ -48,7 +48,7 @@ int ext2_file_create(ext2_inode_t* parent, const char* name,
// Verzeichniseintrag anlegen
if (!ext2_dir_link(parent, newi, name)) {
return 0;
goto fail;
}
if (!ext2_inode_update(newi) ||
......@@ -58,5 +58,9 @@ int ext2_file_create(ext2_inode_t* parent, const char* name,
}
return 1;
fail:
ext2_inode_free(newi);
return 0;
}
......@@ -82,7 +82,7 @@ void ext2_dir_foreach(ext2_inode_t* inode,
* @return Pointer auf den gefundenen Verzeichniseintrag. Muss mit free
* freigegeben.
*/
ext2_dirent_t* ext2_dir_get(ext2_inode_t* inode, char* name);
ext2_dirent_t* ext2_dir_get(ext2_inode_t* inode, const char* name);
/**
* Sucht einen Inode nach dem Pfad
......
......@@ -58,7 +58,7 @@ int ext2_symlink_create(ext2_inode_t* parent,
// Verzeichniseintrag anlegen
if (!ext2_dir_link(parent, newi, name)) {
return 0;
goto fail;
}
// Initialisierung des Inode
......@@ -79,8 +79,11 @@ int ext2_symlink_create(ext2_inode_t* parent,
return 0;
}
return 1;
fail:
ext2_inode_free(newi);
return 0;
}
/**
......
File added
#include <ext2.h>
#include <string.h>
#include <stdio.h>
#include <test.h>
/**
* Test: duplicate_entries
* Autor: Kevin Wolf
* Zweck: Zwei Sachen mit gleichem Namen im gleichen Verzeichnis gehen nicht
*/
int run_test(ext2_fs_t* fs)
{
ext2_inode_t rootdir;
ext2_inode_t new;
ext2_inode_t failing;
if (!ext2_fs_mount(fs)) {
test_interror("Mounten fehlgeschlagen");
}
if (!ext2_inode_read(fs, EXT2_ROOTDIR_INODE, &rootdir)) {
test_interror("Fehler beim Lesen des Rootverzeichnis-Inode");
}
/* Verzeichnis anlegen und versuchen, etwas gleichnamiges zu erstellen */
if (!ext2_dir_create(&rootdir, "dir", &new)) {
test_error("Fehler beim Anlegen des ersten Verzeichnisses 'dir'");
}
if (ext2_dir_create(&rootdir, "dir", &failing)) {
test_error("Kein Fehler beim doppelten Verzeichnis 'dir'");
}
if (ext2_file_create(&rootdir, "dir", &failing)) {
test_error("Kein Fehler bei der doppelten Datei 'dir'");
}
if (ext2_symlink_create(&rootdir, "dir", "x", &failing)) {
test_error("Kein Fehler beim doppelten Symlink 'dir'");
}
if (ext2_dir_link(&rootdir, &new, "dir")) {
test_error("Kein Fehler beim doppelten Hardlink 'dir'");
}
ext2_inode_release(&new);
/* Datei anlegen und versuchen, etwas gleichnamiges zu erstellen */
if (!ext2_dir_create(&rootdir, "file", &new)) {
test_error("Fehler beim Anlegen des ersten Verzeichnisses 'file'");
}
if (ext2_dir_create(&rootdir, "file", &failing)) {
test_error("Kein Fehler beim doppelten Verzeichnis 'file'");
}
if (ext2_file_create(&rootdir, "file", &failing)) {
test_error("Kein Fehler bei der doppelten Datei 'file'");
}
if (ext2_symlink_create(&rootdir, "file", "x", &failing)) {
test_error("Kein Fehler beim doppelten Symlink 'file'");
}
if (ext2_dir_link(&rootdir, &new, "file")) {
test_error("Kein Fehler beim doppelten Hardlink 'file'");
}
ext2_inode_release(&new);
ext2_inode_release(&rootdir);
ext2_fs_sync(fs);
test_etool();
test_fsck();
return 0;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment