Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 298763 Details for
Bug 437921
[PATCH] NFSv3: mode of the symlink can be update
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
Use the c program to reproduce this problem.
link_setattr.c (text/plain), 8.17 KB, created by
biannm
on 2008-03-21 02:43:05 UTC
(
hide
)
Description:
Use the c program to reproduce this problem.
Filename:
MIME Type:
Creator:
biannm
Created:
2008-03-21 02:43:05 UTC
Size:
8.17 KB
patch
obsolete
>#include <stdio.h> >#include <sys/types.h> >#include <sys/stat.h> >#include <fcntl.h> >#include <time.h> >#include <rpc/rpc.h> >#include <rpc/clnt.h> >#include <rpc/xdr.h> > >#define NFS_VERSION 3 >#define RPC_MOUNT_PROC 100005 >#define NFS3_MNT_NULL 0 >#define NFS3_MNT_ARG 1 >#define NFS3_UMNT_ARG 3 >#define NFS_PROC3 100003 > >#define NFSPROC3_SETATTR 2 >#define NFSPROC3_READDIRPLUS 17 > >#define NFSV3_FH 32 >#define NFSv3_FATTR 84 >#define MAX_NAME 256 > >static union { char c[4]; unsigned long l; } endian_test = { { '\1', '?', '?', '\0' } }; >#define TRANS(var1, var2) if(((char)endian_test.l)){var2 = ntohl(var1);} > >/////////////////////////////////////////////////////////////////////////////////////////////// >bool_t xdr_mnt3_args (XDR * xdrs, void ** objp); >bool_t xdr_mnt3_res (XDR * xdrs, void ** objp); >bool_t xdr_umnt3_args (XDR * xdrs, void ** objp); >bool_t xdr_umnt3_res (XDR * xdrs, void ** objp); >bool_t xdr_readdirplus_args(XDR * xdrs, void ** objp); >bool_t xdr_readdirplus_res(XDR * xdrs, void ** objp); >bool_t xdr_entries(XDR * xdrs, void ** handle); >bool_t xdr_fattr(XDR * xdrs, char * attr); >bool_t xdr_setattr_args (XDR * xdrs, void ** objp); >bool_t xdr_setattr_res (XDR * xdrs, void ** objp); >bool_t xdr_fhandle(XDR *xdrs, char *objp, int *len); > >int test_link_chmod(char * server, char * root_name); >bool_t skip_buf_len(XDR *xdrs, int len); >bool_t get_buf_len(XDR *xdrs, char *pret, int len); > >struct timeval time_out = {5, 0}; >char link_fd[NFSV3_FH] = {0}, root_fd[NFSV3_FH] = {0}; >int link_fd_len = 0, root_fd_len = 0; >////////////////////////////////////////////////////////////////////////////////////////// >int main(int argc, char * argv[]) { > char * server, *root, *filename; > char * handle; > > if(argc < 3) { > printf("Error! lost argument!\n"); > return -1; > } > > server = argv[1]; > root = argv[2]; > return test_link_chmod(server, root); >} > > >int test_link_chmod(char * server, char * root_name) { > CLIENT *mclnt, *nclnt; > enum clnt_stat stat; > gid_t aup_gids = 0; > AUTH * auth; > > char dirplus[1024] = {0}; > > /*create rpc client used to get root's fhandle*/ > mclnt = clnt_create(server, RPC_MOUNT_PROC, NFS_VERSION, "tcp"); > if (mclnt == (CLIENT *)NULL) { > clnt_pcreateerror(server); > exit(1); > } > > auth = authunix_create("RHEL4.6_NUT", 0, 0, 1, &aup_gids); > mclnt->cl_auth = auth; > > /*mount -t nfs -o protocol=tcp server:/root ...*/ > stat = clnt_call(mclnt, NFS3_MNT_ARG, > (xdrproc_t)xdr_mnt3_args, > (caddr_t )(&root_name), > (xdrproc_t)xdr_mnt3_res, > (caddr_t )(&root_fd), > time_out); > > /*umnt*/ > stat = clnt_call(mclnt, NFS3_UMNT_ARG, > (xdrproc_t)xdr_umnt3_args, > (caddr_t )(&root_name), > (xdrproc_t)xdr_umnt3_res, > (caddr_t )(&root_fd), > time_out); > > auth_destroy(auth); > clnt_destroy(mclnt); > > /*create rpc client used to chmod*/ > nclnt = clnt_create(server, NFS_PROC3, NFS_VERSION, "tcp"); > aup_gids = 0; > auth = authunix_create("RHEL4.6_NUT", 0, 0, 1, &aup_gids); > nclnt->cl_auth = auth; > > /*readdirplus to get fhandle*/ > stat = clnt_call(nclnt, NFSPROC3_READDIRPLUS, > (xdrproc_t)xdr_readdirplus_args, > (caddr_t )(&root_fd), > (xdrproc_t)xdr_readdirplus_res, > (caddr_t )(&dirplus), > time_out); > > /*setattr*/ > stat = clnt_call(nclnt, NFSPROC3_SETATTR, > (xdrproc_t)xdr_setattr_args, > (caddr_t )(&root_fd), > (xdrproc_t)xdr_setattr_res, > (caddr_t )(&dirplus), > time_out); > > auth_destroy(auth); > clnt_destroy(nclnt); > > return stat; >} > >bool_t xdr_mnt3_args (XDR * xdrs, void ** objp) >{ > if(!xdr_string(xdrs, (char **)objp, strlen(*objp))) > return FALSE; > return TRUE; >} > >bool_t xdr_mnt3_res (XDR * xdrs, void ** objp) >{ > uint32_t stat; > if(!xdr_uint32_t(xdrs, &stat)) > return FALSE; > if(stat != 0) > return FALSE; > if(!xdr_fhandle(xdrs, root_fd, &root_fd_len)) > return FALSE; > return TRUE; >} > >bool_t xdr_umnt3_args (XDR * xdrs, void ** objp) >{ > if(!xdr_string(xdrs, (char **)objp, strlen(*objp))) > return FALSE; > return TRUE; >} > >bool_t xdr_umnt3_res (XDR * xdrs, void ** objp) >{ > return TRUE; >} > > >bool_t xdr_setattr_args (XDR * xdrs, void ** objp) >{ > uint32_t follows = 1; > uint32_t mode = 0xa124; > uint32_t st = 0; > > if(!xdr_opaque(xdrs, (caddr_t)(&link_fd), link_fd_len)) > return FALSE; > if(!xdr_uint32_t(xdrs, &follows)) > return FALSE; > /*set mode = 444*/ > if(!xdr_uint32_t(xdrs, &mode)) > return FALSE; > follows = 0; > if(!xdr_uint32_t(xdrs, &follows)) > return FALSE; > if(!xdr_uint32_t(xdrs, &follows)) > return FALSE; > if(!xdr_uint32_t(xdrs, &follows)) > return FALSE; > if(!xdr_uint32_t(xdrs, &st)) > return FALSE; > if(!xdr_uint32_t(xdrs, &st)) > return FALSE; > if(!xdr_uint32_t(xdrs, &follows)) > return FALSE; > return TRUE; >} > >bool_t xdr_setattr_res (XDR * xdrs, void ** objp) >{ > return TRUE; >} > > >bool_t xdr_readdirplus_args(XDR * xdrs, void ** objp) >{ > uint64_t cookie, verf; > uint32_t dircount, maxcount; > > cookie = verf = 0; > dircount = 512; > maxcount = 4096; > > if(!xdr_opaque(xdrs, (caddr_t)(&root_fd), root_fd_len)) > return FALSE; > if(!xdr_uint64_t(xdrs, &cookie)) > return FALSE; > if(!xdr_uint64_t(xdrs, &verf)) > return FALSE; > if(!xdr_uint32_t(xdrs, &dircount)) > return FALSE; > if(!xdr_uint32_t(xdrs, &maxcount)) > return FALSE; > return TRUE; >} > > >bool_t xdr_readdirplus_res(XDR * xdrs, void ** objp) >{ > uint32_t stat, isfollow; > uint64_t verifer; > char attr[NFSv3_FATTR]; > > if(!xdr_uint32_t(xdrs, &stat)) > goto error_out; > if(!xdr_fattr(xdrs, attr)) > goto error_out; > if(!xdr_uint64_t(xdrs, &verifer)) > goto error_out; > if(!xdr_uint32_t(xdrs, &isfollow)) > goto error_out; > while(isfollow) { > if(!xdr_entries(xdrs, objp)) > goto error_out; > if(!xdr_uint32_t(xdrs, &isfollow)) > goto error_out; > } > > return TRUE; >error_out: > return FALSE; >} > >bool_t xdr_entries(XDR * xdrs, void ** handle) >{ > char name[MAX_NAME] = {0}, fd[NFSV3_FH] = {0}, attr[NFSv3_FATTR] = {0}; > uint32_t isfollow, flen, name_len, index, tmp; > uint64_t id, cookie; > > /*file id*/ > if(!xdr_uint64_t(xdrs, &id)) > goto error_out; > /*name.len*/ > if(!xdr_uint32_t(xdrs, &name_len)) > goto error_out; > > if(!get_buf_len(xdrs, name, name_len)) > goto error_out; > if(!xdr_uint64_t(xdrs, &cookie)) > goto error_out; > if(!xdr_fattr(xdrs, attr)) > goto error_out; > if(!xdr_uint32_t(xdrs, &isfollow)) > goto error_out; > if(isfollow){ > if(!xdr_fhandle(xdrs, fd, &flen)) > goto error_out; > if(0 == memcmp(name, "link", strlen("link"))) { > memcpy((char *)link_fd, fd, flen); > link_fd_len = flen; > } > } > > return TRUE; > >error_out: > return FALSE; >} > > >bool_t xdr_fattr(XDR * xdrs, char * attr) >{ > uint32_t isfollow; > > if(!xdr_uint32_t(xdrs, &isfollow)) > return FALSE; > if(isfollow) > return skip_buf_len(xdrs, NFSv3_FATTR); > > return TRUE; >} > >bool_t xdr_fhandle(XDR *xdrs, char *fhandle, int *flen) >{ > uint32_t len, tmp; > u_int index; > if(!xdr_uint32_t(xdrs, &len)) > return FALSE; > > *flen = 4 + len; > TRANS(len, tmp); > memcpy(fhandle, (char *)(&tmp), sizeof(uint32_t)); > > if(!get_buf_len(xdrs, fhandle + 4, len)) > return FALSE; > return TRUE; >} > >bool_t skip_buf_len(XDR *xdrs, int len) >{ > uint32_t index, tmp; > > len = (len%4 ? (4 - len%4) : 0) + len; > > for(index = 0; index < len; index += 4) { > if(!xdr_uint32_t(xdrs, &tmp)) > return FALSE; > } > return TRUE; >} > >bool_t get_buf_len(XDR *xdrs, char *pret, int len) >{ > uint32_t index, tmp; > > len = (len%4 ? (4 - len%4) : 0) + len; > > for(index = 0; index < len; index += 4) { > if(!xdr_uint32_t(xdrs, &tmp)) > return FALSE; > TRANS(tmp,tmp); > memcpy(pret + index, (char *)(&tmp), sizeof(uint32_t)); > } > return TRUE; >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 437921
:
298339
| 298763 |
302448