[PATCH 03/18] fs: add symlink support

Sascha Hauer s.hauer at pengutronix.de
Mon Aug 27 09:35:56 EDT 2012


On Fri, Aug 24, 2012 at 06:50:03AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Limit it's support to existing file only
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  fs/fs.c      |   43 +++++++++++++++++++++++++++++++++++++++++++
>  include/fs.h |    4 ++++
>  2 files changed, 47 insertions(+)
> 
> diff --git a/fs/fs.c b/fs/fs.c
> index c950054..a19e1f4 100644
> --- a/fs/fs.c
> +++ b/fs/fs.c
> @@ -949,6 +949,49 @@ out:
>  }
>  EXPORT_SYMBOL(readlink);
>  
> +int symlink(const char *pathname, const char *newpath)
> +{
> +	struct fs_driver_d *fsdrv;
> +	struct fs_device_d *fsdev;
> +	char *p = normalise_path(pathname);
> +	int ret;
> +	struct stat s;
> +
> +	if (!stat(p, &s) && S_ISDIR(s.st_mode)) {
> +		ret = -ENOSYS;
> +		goto out;

You lose the memory allocated in normalise_path here.

> +	}
> +
> +	free(p);
> +	p = normalise_path(newpath);

p is never freed again.

> +
> +	ret = stat(p, &s);
> +	if (!ret) {
> +		ret = -EEXIST;
> +		goto out;
> +	}
> +
> +	fsdev = get_fs_device_and_root_path(&p);
> +	if (!fsdev) {
> +		ret = -ENODEV;
> +		goto out;
> +	}
> +	fsdrv = fsdev->driver;
> +
> +	if (fsdrv->symlink) {
> +		ret = fsdrv->symlink(&fsdev->dev, pathname, p);
> +	} else {
> +		ret = -EROFS;

Better:

EPERM  The file system containing newpath does not support the creation of symbolic links.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list