VirtualBox

source: vbox/trunk/src/VBox/Additions/linux/sharedfolders/lnkops.c@ 36638

Last change on this file since 36638 was 35854, checked in by vboxsync, 14 years ago

Linux Additions / shared folders: fix possible memory leak in error case

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 1.7 KB
Line 
1/** @file
2 *
3 * vboxsf -- VirtualBox Guest Additions for Linux:
4 * Operations for symbolic links.
5 */
6
7/*
8 * Copyright (C) 2010-2011 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include "vfsmod.h"
20
21#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
22
23static void *sf_follow_link(struct dentry *dentry, struct nameidata *nd)
24{
25 struct inode *inode = dentry->d_inode;
26 struct sf_glob_info *sf_g = GET_GLOB_INFO(inode->i_sb);
27 struct sf_inode_info *sf_i = GET_INODE_INFO(inode);
28 int error = -ENOMEM;
29 char *path = (char*)get_zeroed_page(GFP_KERNEL);
30 int rc;
31
32 if (path)
33 {
34 error = 0;
35 rc = vboxReadLink(&client_handle, &sf_g->map, sf_i->path, PATH_MAX, path);
36 if (RT_FAILURE(rc))
37 {
38 LogFunc(("vboxReadLink failed, caller=%s, rc=%Rrc\n", __func__, rc));
39 free_page((unsigned long)path);
40 error = -EPROTO;
41 }
42 }
43 nd_set_link(nd, error ? ERR_PTR(error) : path);
44 return NULL;
45}
46
47static void sf_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
48{
49 char *page = nd_get_link(nd);
50 if (!IS_ERR(page))
51 free_page((unsigned long)page);
52}
53
54struct inode_operations sf_lnk_iops =
55{
56 .readlink = generic_readlink,
57 .follow_link = sf_follow_link,
58 .put_link = sf_put_link
59};
60
61#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette