Skip to content

Commit

Permalink
ext2: Remove path length limit
Browse files Browse the repository at this point in the history
JIRA: RTOS-675
  • Loading branch information
jmaksymowicz committed Nov 23, 2023
1 parent 09a029e commit 7f2d478
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 41 deletions.
17 changes: 11 additions & 6 deletions ext2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ int _ext2_dir_empty(ext2_t *fs, ext2_obj_t *dir)
}


static int _ext2_dir_find(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, char *buff, uint32_t *offs)
static int _ext2_dir_find(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len, char *buff, uint32_t *offs)
{
ext2_dirent_t *entry;
uint32_t boffs;
Expand All @@ -84,7 +84,7 @@ static int _ext2_dir_find(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t
if (!entry->size)
break;

if ((entry->len == len) && !strncmp(entry->name, name, len))
if (((size_t)entry->len == len) && !strncmp(entry->name, name, len))
return boffs;
}
}
Expand All @@ -93,7 +93,7 @@ static int _ext2_dir_find(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t
}


int _ext2_dir_search(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, id_t *res)
int _ext2_dir_search(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len, id_t *res)
{
uint32_t offs = 0;
char *buff;
Expand Down Expand Up @@ -185,13 +185,17 @@ int _ext2_dir_read(ext2_t *fs, ext2_obj_t *dir, offs_t offs, struct dirent *res,
}


int _ext2_dir_add(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, uint16_t mode, uint32_t ino)
int _ext2_dir_add(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len, uint16_t mode, uint32_t ino)
{
uint32_t offs, size = 0;
ext2_dirent_t *entry;
char *buff;
ssize_t ret;

if (len > MAX_NAMELEN) {
return -ENAMETOOLONG;
}

if ((buff = (char *)malloc(fs->blocksz)) == NULL)
return -ENOMEM;

Expand All @@ -214,7 +218,8 @@ int _ext2_dir_add(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, ui
entry->size = (entry->len) ? (entry->len + sizeof(ext2_dirent_t) + 3) & ~3 : 0;
offs += entry->size;

if ((size = (len + sizeof(ext2_dirent_t) + 3) & ~3) >= fs->blocksz - offs) {
size = (len + sizeof(ext2_dirent_t) + 3) & ~3;
if (size >= fs->blocksz - offs) {
entry->size += fs->blocksz - offs;
offs = fs->blocksz;
break;
Expand Down Expand Up @@ -264,7 +269,7 @@ int _ext2_dir_add(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, ui
}


int _ext2_dir_remove(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len)
int _ext2_dir_remove(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len)
{
ext2_dirent_t *entry, *tmp;
uint32_t prev, boffs, offs = 0;
Expand Down
7 changes: 4 additions & 3 deletions ext2/dir.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#define _DIR_H_

#include <dirent.h>
#include <stddef.h>
#include <stdint.h>

#include <sys/types.h>
Expand Down Expand Up @@ -51,19 +52,19 @@ extern int _ext2_dir_empty(ext2_t *fs, ext2_obj_t *dir);


/* Searches directory for a given file name (requires object to be locked) */
extern int _ext2_dir_search(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, id_t *res);
extern int _ext2_dir_search(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len, id_t *res);


/* Reads directory entry (requires object to be locked) */
extern int _ext2_dir_read(ext2_t *fs, ext2_obj_t *dir, offs_t offs, struct dirent *res, size_t len);


/* Adds directory entry (requires object to be locked) */
extern int _ext2_dir_add(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len, uint16_t mode, uint32_t ino);
extern int _ext2_dir_add(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len, uint16_t mode, uint32_t ino);


/* Removes directory entry (requires object to be locked) */
extern int _ext2_dir_remove(ext2_t *fs, ext2_obj_t *dir, const char *name, uint8_t len);
extern int _ext2_dir_remove(ext2_t *fs, ext2_obj_t *dir, const char *name, size_t len);


#endif
10 changes: 5 additions & 5 deletions ext2/ext2.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#include "file.h"


int ext2_create(ext2_t *fs, id_t id, const char *name, uint8_t len, oid_t *dev, uint16_t mode, id_t *res)
int ext2_create(ext2_t *fs, id_t id, const char *name, size_t len, oid_t *dev, uint16_t mode, id_t *res)
{
ext2_obj_t *obj;
int err;
Expand Down Expand Up @@ -74,10 +74,10 @@ int ext2_destroy(ext2_t *fs, id_t id)
}


int ext2_lookup(ext2_t *fs, id_t id, const char *name, uint8_t len, oid_t *res, oid_t *dev)
int ext2_lookup(ext2_t *fs, id_t id, const char *name, size_t len, oid_t *res, oid_t *dev)
{
ext2_obj_t *dir, *obj = NULL;
uint8_t i, j;
size_t i, j;
int err;

res->port = fs->port;
Expand Down Expand Up @@ -424,7 +424,7 @@ int ext2_setattr(ext2_t *fs, id_t id, int type, long long attr)
}


int ext2_link(ext2_t *fs, id_t id, const char *name, uint8_t len, id_t lid)
int ext2_link(ext2_t *fs, id_t id, const char *name, size_t len, id_t lid)
{
ext2_obj_t *dir, *obj;
id_t res;
Expand Down Expand Up @@ -498,7 +498,7 @@ int ext2_link(ext2_t *fs, id_t id, const char *name, uint8_t len, id_t lid)
}


int ext2_unlink(ext2_t *fs, id_t id, const char *name, uint8_t len)
int ext2_unlink(ext2_t *fs, id_t id, const char *name, size_t len)
{
ext2_obj_t *dir, *obj;
id_t res;
Expand Down
8 changes: 4 additions & 4 deletions ext2/ext2.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,15 @@ typedef struct {


/* Creates a file */
extern int ext2_create(ext2_t *fs, id_t id, const char *name, uint8_t len, oid_t *dev, uint16_t mode, id_t *res);
extern int ext2_create(ext2_t *fs, id_t id, const char *name, size_t len, oid_t *dev, uint16_t mode, id_t *res);


/* Destroys a file */
extern int ext2_destroy(ext2_t *fs, id_t id);


/* Lookups a file */
extern int ext2_lookup(ext2_t *fs, id_t id, const char *name, uint8_t len, oid_t *res, oid_t *dev);
extern int ext2_lookup(ext2_t *fs, id_t id, const char *name, size_t len, oid_t *res, oid_t *dev);


/* Opens a file */
Expand Down Expand Up @@ -112,11 +112,11 @@ extern int ext2_setattr(ext2_t *fs, id_t id, int type, long long attr);


/* Adds a link */
extern int ext2_link(ext2_t *fs, id_t id, const char *name, uint8_t len, id_t lid);
extern int ext2_link(ext2_t *fs, id_t id, const char *name, size_t len, id_t lid);


/* Removes a link */
extern int ext2_unlink(ext2_t *fs, id_t id, const char *name, uint8_t len);
extern int ext2_unlink(ext2_t *fs, id_t id, const char *name, size_t len);


/* Retrieves filesystem statistics */
Expand Down
27 changes: 4 additions & 23 deletions ext2/libext2.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ static int libext2_create(void *info, oid_t *oid, const char *name, oid_t *dev,
ext2_t *fs = (ext2_t *)info;
ext2_obj_t *obj;
oid_t devOther;
size_t namelen;
int ret;
dev->port = fs->port;

Expand All @@ -53,10 +52,7 @@ static int libext2_create(void *info, oid_t *oid, const char *name, oid_t *dev,
break;
}

namelen = strlen(name);
if (namelen > UINT8_MAX) {
return -ENAMETOOLONG;
}
size_t namelen = strlen(name);

if (ext2_lookup(fs, oid->id, name, namelen, dev, &devOther) > 0) {
if ((obj = ext2_obj_get(fs, dev->id)) == NULL) {
Expand Down Expand Up @@ -168,34 +164,19 @@ static int libext2_destroy(void *info, oid_t *oid)

static int libext2_lookup(void *info, oid_t *oid, const char *name, oid_t *res, oid_t *dev, char *lnk, int lnksz)
{
size_t namelen = strlen(name);
if (namelen > UINT8_MAX) {
return -ENAMETOOLONG;
}

return ext2_lookup((ext2_t *)info, oid->id, name, namelen, res, dev);
return ext2_lookup((ext2_t *)info, oid->id, name, strlen(name), res, dev);
}


static int libext2_link(void *info, oid_t *oid, const char *name, oid_t *res)
{
size_t namelen = strlen(name);
if (namelen > UINT8_MAX) {
return -ENAMETOOLONG;
}

return ext2_link((ext2_t *)info, oid->id, name, namelen, res->id);
return ext2_link((ext2_t *)info, oid->id, name, strlen(name), res->id);
}


static int libext2_unlink(void *info, oid_t *oid, const char *name)
{
size_t namelen = strlen(name);
if (namelen > UINT8_MAX) {
return -ENAMETOOLONG;
}

return ext2_unlink((ext2_t *)info, oid->id, name, namelen);
return ext2_unlink((ext2_t *)info, oid->id, name, strlen(name));
}


Expand Down

0 comments on commit 7f2d478

Please sign in to comment.