smb_conn.c (116189) | smb_conn.c (119376) |
---|---|
1/* 2 * Copyright (c) 2000-2001 Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 21 unchanged lines hidden (view full) --- 30 * SUCH DAMAGE. 31 */ 32 33/* 34 * Connection engine. 35 */ 36 37#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 2000-2001 Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 21 unchanged lines hidden (view full) --- 30 * SUCH DAMAGE. 31 */ 32 33/* 34 * Connection engine. 35 */ 36 37#include <sys/cdefs.h> |
38__FBSDID("$FreeBSD: head/sys/netsmb/smb_conn.c 116189 2003-06-11 05:37:42Z obrien $"); | 38__FBSDID("$FreeBSD: head/sys/netsmb/smb_conn.c 119376 2003-08-23 21:43:33Z marcel $"); |
39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> 43#include <sys/malloc.h> 44#include <sys/proc.h> 45#include <sys/lock.h> 46#include <sys/sysctl.h> --- 76 unchanged lines hidden (view full) --- 123 int error; 124 125 vcspec->shspec = shspec; 126 error = ENOENT; 127 SMBCO_FOREACH((struct smb_connobj*)vcp, &smb_vclist) { 128 error = smb_vc_lock(vcp, LK_EXCLUSIVE, td); 129 if (error) 130 continue; | 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> 43#include <sys/malloc.h> 44#include <sys/proc.h> 45#include <sys/lock.h> 46#include <sys/sysctl.h> --- 76 unchanged lines hidden (view full) --- 123 int error; 124 125 vcspec->shspec = shspec; 126 error = ENOENT; 127 SMBCO_FOREACH((struct smb_connobj*)vcp, &smb_vclist) { 128 error = smb_vc_lock(vcp, LK_EXCLUSIVE, td); 129 if (error) 130 continue; |
131 itry { 132 if ((vcp->obj.co_flags & SMBV_PRIVATE) || 133 !CONNADDREQ(vcp->vc_paddr, vcspec->sap) || 134 strcmp(vcp->vc_username, vcspec->username) != 0) 135 ithrow(1); 136 if (vcspec->owner != SMBM_ANY_OWNER) { 137 if (vcp->vc_uid != vcspec->owner) 138 ithrow(1); 139 } else 140 exact = 0; 141 if (vcspec->group != SMBM_ANY_GROUP) { 142 if (vcp->vc_grp != vcspec->group) 143 ithrow(1); 144 } else 145 exact = 0; | |
146 | 131 |
147 if (vcspec->mode & SMBM_EXACT) { 148 if (!exact || 149 (vcspec->mode & SMBM_MASK) != vcp->vc_mode) 150 ithrow(1); 151 } 152 if (smb_vc_access(vcp, scred, vcspec->mode) != 0) 153 ithrow(1); 154 vcspec->ssp = NULL; 155 if (shspec) 156 ithrow(smb_vc_lookupshare(vcp, shspec, scred, &vcspec->ssp)); 157 error = 0; 158 break; 159 } icatch(error) { 160 smb_vc_unlock(vcp, 0, td); 161 } ifinally { 162 } iendtry; 163 if (error == 0) 164 break; | 132 if ((vcp->obj.co_flags & SMBV_PRIVATE) || 133 !CONNADDREQ(vcp->vc_paddr, vcspec->sap) || 134 strcmp(vcp->vc_username, vcspec->username) != 0) 135 goto err1; 136 if (vcspec->owner != SMBM_ANY_OWNER) { 137 if (vcp->vc_uid != vcspec->owner) 138 goto err1; 139 } else 140 exact = 0; 141 if (vcspec->group != SMBM_ANY_GROUP) { 142 if (vcp->vc_grp != vcspec->group) 143 goto err1; 144 } else 145 exact = 0; 146 if (vcspec->mode & SMBM_EXACT) { 147 if (!exact || (vcspec->mode & SMBM_MASK) != 148 vcp->vc_mode) 149 goto err1; 150 } 151 if (smb_vc_access(vcp, scred, vcspec->mode) != 0) 152 goto err1; 153 vcspec->ssp = NULL; 154 if (shspec) { 155 error = (int)smb_vc_lookupshare(vcp, shspec, scred, 156 &vcspec->ssp); 157 if (error) 158 goto fail; 159 } 160 error = 0; 161 break; 162 err1: 163 error = 1; 164 fail: 165 smb_vc_unlock(vcp, 0, td); |
165 } 166 if (vcp) { 167 smb_vc_ref(vcp); 168 *vcpp = vcp; 169 } | 166 } 167 if (vcp) { 168 smb_vc_ref(vcp); 169 *vcpp = vcp; 170 } |
170 return error; | 171 return (error); |
171} 172 173int 174smb_sm_lookup(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, 175 struct smb_cred *scred, struct smb_vc **vcpp) 176{ 177 struct thread *td = scred->scr_td; 178 struct smb_vc *vcp; --- 229 unchanged lines hidden (view full) --- 408 if (uid == SMBM_ANY_OWNER) 409 uid = realuid; 410 if (gid == SMBM_ANY_GROUP) 411 gid = cred->cr_groups[0]; 412 vcp->vc_uid = uid; 413 vcp->vc_grp = gid; 414 415 smb_sl_init(&vcp->vc_stlock, "vcstlock"); | 172} 173 174int 175smb_sm_lookup(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, 176 struct smb_cred *scred, struct smb_vc **vcpp) 177{ 178 struct thread *td = scred->scr_td; 179 struct smb_vc *vcp; --- 229 unchanged lines hidden (view full) --- 409 if (uid == SMBM_ANY_OWNER) 410 uid = realuid; 411 if (gid == SMBM_ANY_GROUP) 412 gid = cred->cr_groups[0]; 413 vcp->vc_uid = uid; 414 vcp->vc_grp = gid; 415 416 smb_sl_init(&vcp->vc_stlock, "vcstlock"); |
416 error = 0; 417 itry { 418 vcp->vc_paddr = dup_sockaddr(vcspec->sap, 1); 419 ierror(vcp->vc_paddr == NULL, ENOMEM); | 417 error = ENOMEM; |
420 | 418 |
421 vcp->vc_laddr = dup_sockaddr(vcspec->lap, 1); 422 ierror(vcp->vc_laddr == NULL, ENOMEM); | 419 vcp->vc_paddr = dup_sockaddr(vcspec->sap, 1); 420 if (vcp->vc_paddr == NULL) 421 goto fail; 422 vcp->vc_laddr = dup_sockaddr(vcspec->lap, 1); 423 if (vcp->vc_laddr == NULL) 424 goto fail; 425 vcp->vc_pass = smb_strdup(vcspec->pass); 426 if (vcp->vc_pass == NULL) 427 goto fail; 428 vcp->vc_domain = smb_strdup((domain && domain[0]) ? domain : 429 "NODOMAIN"); 430 if (vcp->vc_domain == NULL) 431 goto fail; 432 vcp->vc_srvname = smb_strdup(vcspec->srvname); 433 if (vcp->vc_srvname == NULL) 434 goto fail; 435 vcp->vc_username = smb_strdup(vcspec->username); 436 if (vcp->vc_username == NULL) 437 goto fail; 438 error = (int)iconv_open("tolower", vcspec->localcs, &vcp->vc_tolower); 439 if (error) 440 goto fail; 441 error = (int)iconv_open("toupper", vcspec->localcs, &vcp->vc_toupper); 442 if (error) 443 goto fail; 444 if (vcspec->servercs[0]) { 445 error = (int)iconv_open(vcspec->servercs, vcspec->localcs, 446 &vcp->vc_toserver); 447 if (error) 448 goto fail; 449 error = (int)iconv_open(vcspec->localcs, vcspec->servercs, 450 &vcp->vc_tolocal); 451 if (error) 452 goto fail; 453 } 454 error = (int)smb_iod_create(vcp); 455 if (error) 456 goto fail; 457 *vcpp = vcp; 458 smb_co_addchild(&smb_vclist, VCTOCP(vcp)); 459 return (0); |
423 | 460 |
424 ierror((vcp->vc_pass = smb_strdup(vcspec->pass)) == NULL, ENOMEM); 425 426 vcp->vc_domain = smb_strdup((domain && domain[0]) ? domain : "NODOMAIN"); 427 ierror(vcp->vc_domain == NULL, ENOMEM); 428 429 ierror((vcp->vc_srvname = smb_strdup(vcspec->srvname)) == NULL, ENOMEM); 430 ierror((vcp->vc_username = smb_strdup(vcspec->username)) == NULL, ENOMEM); 431 432 ithrow(iconv_open("tolower", vcspec->localcs, &vcp->vc_tolower)); 433 ithrow(iconv_open("toupper", vcspec->localcs, &vcp->vc_toupper)); 434 if (vcspec->servercs[0]) { 435 ithrow(iconv_open(vcspec->servercs, vcspec->localcs, 436 &vcp->vc_toserver)); 437 ithrow(iconv_open(vcspec->localcs, vcspec->servercs, 438 &vcp->vc_tolocal)); 439 } 440 441 ithrow(smb_iod_create(vcp)); 442 *vcpp = vcp; 443 smb_co_addchild(&smb_vclist, VCTOCP(vcp)); 444 } icatch(error) { 445 smb_vc_put(vcp, scred); 446 } ifinally { 447 } iendtry; 448 return error; | 461 fail: 462 smb_vc_put(vcp, scred); 463 return (error); |
449} 450 451static void 452smb_vc_free(struct smb_connobj *cp) 453{ 454 struct smb_vc *vcp = CPTOVC(cp); 455 456 if (vcp->vc_iod) --- 418 unchanged lines hidden --- | 464} 465 466static void 467smb_vc_free(struct smb_connobj *cp) 468{ 469 struct smb_vc *vcp = CPTOVC(cp); 470 471 if (vcp->vc_iod) --- 418 unchanged lines hidden --- |