Samba 3.0 - Bug preventing mkfifo as non-root
Jeremy Allison
jra at samba.org
Sun Jan 21 02:50:26 GMT 2007
On Sun, Jan 21, 2007 at 02:43:25AM +0000, Anders Karlsson wrote:
>
> Grabbed the src.rpm or 3.0.23d and built on my FC6 system. Behaviour is
> exactly the same as with Fedoras 3.0.23c. Interestingly, mount.cifs is
> still version 1.10 in those samba packages. Would that have anything to
> do with creation of FIFOs failing?
No.
> I would be really interested in seeing the actual patch / commit that
> enabled this to work. It would be useful for tinkering around with.
How are you doing the mount.cifs ?
I use mount.cifs //server/share /mnt -o user=xxx,pass=yyy
and then I can :
cd /mnt; mkfifo foo
and all works.
Here is the relevent code from smbd/trans2.c
4232 DEBUG(10,("call_trans2setfilepathinfo:
SMB_SET_FILE_UNIX_BASIC: name = %s \
4233 size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
4234 fname, (double)size, (unsigned
int)set_owner, (unsigned int)set_grp, (int)raw_unixmode));
4235
4236 if (!VALID_STAT(sbuf)) {
4237
4238 /*
4239 * The only valid use of this is to
create character and block
4240 * devices, and named pipes. This
is deprecated (IMHO) and
4241 * a new info level should be used
for mknod. JRA.
4242 */
4243
4244 uint32 file_type = IVAL(pdata,0);
4245 #if defined(HAVE_MAKEDEV)
4246 uint32 dev_major = IVAL(pdata,4);
4247 uint32 dev_minor = IVAL(pdata,12);
4248 #endif
4249
4250 uid_t myuid = geteuid();
4251 gid_t mygid = getegid();
4252 SMB_DEV_T dev = (SMB_DEV_T)0;
4253
4254 if (tran_call ==
TRANSACT2_SETFILEINFO)
4255
return(ERROR_DOS(ERRDOS,ERRnoaccess));
4256
4257 if (raw_unixmode ==
SMB_MODE_NO_CHANGE) {
4258 return
ERROR_NT(NT_STATUS_INVALID_PARAMETER);
4259 }
4260
4261 #if defined(HAVE_MAKEDEV)
4262 dev = makedev(dev_major,
dev_minor);
4263 #endif
4264
4265 /* We can only create as the
owner/group we are. */
4266
4267 if ((set_owner != myuid) &&
(set_owner != (uid_t)SMB_UID_NO_CHANGE))
4268
return(ERROR_DOS(ERRDOS,ERRnoaccess));
4269 if ((set_grp != mygid) && (set_grp
!= (gid_t)SMB_GID_NO_CHANGE))
4270
return(ERROR_DOS(ERRDOS,ERRnoaccess));
4271
4272 switch (file_type) {
4273 #if defined(S_IFIFO)
4274 case UNIX_TYPE_FIFO:
4275 unixmode |=
S_IFIFO;
4276 break;
4277 #endif
4278 #if defined(S_IFSOCK)
4279 case UNIX_TYPE_SOCKET:
4280 unixmode |=
S_IFSOCK;
4281 break;
4282 #endif
4283 #if defined(S_IFCHR)
4284 case UNIX_TYPE_CHARDEV:
4285 unixmode |=
S_IFCHR;
4286 break;
4287 #endif
4288 #if defined(S_IFBLK)
4289 case UNIX_TYPE_BLKDEV:
4290 unixmode |=
S_IFBLK;
4291 break;
4292 #endif
4293 default:
4294
return(ERROR_DOS(ERRDOS,ERRnoaccess));
4295 }
4296
4297
DEBUG(10,("call_trans2setfilepathinfo: SMB_SET_FILE_UNIX_BASIC doing
mknod dev %.0f mode \
4298 0%o for file %s\n", (double)dev, unixmode, fname ));
4299
4300 /* Ok - do the mknod. */
4301 if (SMB_VFS_MKNOD(conn,fname,
unixmode, dev) != 0)
4302
return(UNIXERROR(ERRDOS,ERRnoaccess));
4303
Jeremy.
More information about the samba-technical
mailing list