1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-13 13:18:06 +03:00

make sure that apps can't close one of the internal smbw file

descriptors by catching close attempts on those fds and returning
EBADF.
(This used to be commit 9d863fb168)
This commit is contained in:
Andrew Tridgell 1998-10-24 06:36:22 +00:00
parent f9881e8e74
commit 4140f2bfc1
4 changed files with 32 additions and 2 deletions

View File

@ -2407,11 +2407,13 @@ void smbw_setup_shared(void);
char *smbw_getshared(const char *name);
void smbw_setshared(const char *name, const char *val);
int smbw_setenv(const char *name, const char *value);
int smbw_shared_fd(int fd);
/*The following definitions come from smbwrapper/smbw.c */
void smbw_init(void);
int smbw_fd(int fd);
int smbw_local_fd(int fd);
ino_t smbw_inode(const char *name);
void clean_fname(char *name);
char *smbw_parse_path(const char *fname, char *server, char *share, char *path);

View File

@ -212,3 +212,10 @@ int smbw_setenv(const char *name, const char *value)
return ret;
}
/*****************************************************************
return true if the passed fd is the SMBW_HANDLE
*****************************************************************/
int smbw_shared_fd(int fd)
{
return (shared_fd && shared_fd == fd);
}

View File

@ -125,6 +125,25 @@ int smbw_fd(int fd)
return smbw_file_bmap && bitmap_query(smbw_file_bmap, fd);
}
/*****************************************************
determine if a file descriptor is an internal smbw fd
*******************************************************/
int smbw_local_fd(int fd)
{
struct smbw_server *srv;
smbw_init();
if (smbw_busy) return 0;
if (smbw_shared_fd(fd)) return 1;
for (srv=smbw_srvs;srv;srv=srv->next) {
if (srv->cli.fd == fd) return 1;
}
return 0;
}
/*****************************************************
a crude inode number generator
*******************************************************/
@ -736,7 +755,6 @@ ssize_t smbw_write(int fd, void *buf, size_t count)
file = smbw_file(fd);
if (!file) {
DEBUG(3,("bad fd in read\n"));
errno = EBADF;
smbw_busy--;
return -1;
@ -768,7 +786,6 @@ ssize_t smbw_pwrite(int fd, void *buf, size_t count, off_t ofs)
file = smbw_file(fd);
if (!file) {
DEBUG(3,("bad fd in read\n"));
errno = EBADF;
smbw_busy--;
return -1;

View File

@ -145,6 +145,10 @@
if (smbw_fd(fd)) {
return smbw_close(fd);
}
if (smbw_local_fd(fd)) {
errno = EBADF;
return -1;
}
return real_close(fd);
}