summaryrefslogtreecommitdiffstats
path: root/sys/netsmb/smb_conn.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netsmb/smb_conn.c')
-rw-r--r--sys/netsmb/smb_conn.c151
1 files changed, 83 insertions, 68 deletions
diff --git a/sys/netsmb/smb_conn.c b/sys/netsmb/smb_conn.c
index 9542160..23eb4be 100644
--- a/sys/netsmb/smb_conn.c
+++ b/sys/netsmb/smb_conn.c
@@ -128,46 +128,47 @@ smb_sm_lookupint(struct smb_vcspec *vcspec, struct smb_sharespec *shspec,
error = smb_vc_lock(vcp, LK_EXCLUSIVE, td);
if (error)
continue;
- itry {
- if ((vcp->obj.co_flags & SMBV_PRIVATE) ||
- !CONNADDREQ(vcp->vc_paddr, vcspec->sap) ||
- strcmp(vcp->vc_username, vcspec->username) != 0)
- ithrow(1);
- if (vcspec->owner != SMBM_ANY_OWNER) {
- if (vcp->vc_uid != vcspec->owner)
- ithrow(1);
- } else
- exact = 0;
- if (vcspec->group != SMBM_ANY_GROUP) {
- if (vcp->vc_grp != vcspec->group)
- ithrow(1);
- } else
- exact = 0;
-
- if (vcspec->mode & SMBM_EXACT) {
- if (!exact ||
- (vcspec->mode & SMBM_MASK) != vcp->vc_mode)
- ithrow(1);
- }
- if (smb_vc_access(vcp, scred, vcspec->mode) != 0)
- ithrow(1);
- vcspec->ssp = NULL;
- if (shspec)
- ithrow(smb_vc_lookupshare(vcp, shspec, scred, &vcspec->ssp));
- error = 0;
- break;
- } icatch(error) {
- smb_vc_unlock(vcp, 0, td);
- } ifinally {
- } iendtry;
- if (error == 0)
- break;
+
+ if ((vcp->obj.co_flags & SMBV_PRIVATE) ||
+ !CONNADDREQ(vcp->vc_paddr, vcspec->sap) ||
+ strcmp(vcp->vc_username, vcspec->username) != 0)
+ goto err1;
+ if (vcspec->owner != SMBM_ANY_OWNER) {
+ if (vcp->vc_uid != vcspec->owner)
+ goto err1;
+ } else
+ exact = 0;
+ if (vcspec->group != SMBM_ANY_GROUP) {
+ if (vcp->vc_grp != vcspec->group)
+ goto err1;
+ } else
+ exact = 0;
+ if (vcspec->mode & SMBM_EXACT) {
+ if (!exact || (vcspec->mode & SMBM_MASK) !=
+ vcp->vc_mode)
+ goto err1;
+ }
+ if (smb_vc_access(vcp, scred, vcspec->mode) != 0)
+ goto err1;
+ vcspec->ssp = NULL;
+ if (shspec) {
+ error = (int)smb_vc_lookupshare(vcp, shspec, scred,
+ &vcspec->ssp);
+ if (error)
+ goto fail;
+ }
+ error = 0;
+ break;
+ err1:
+ error = 1;
+ fail:
+ smb_vc_unlock(vcp, 0, td);
}
if (vcp) {
smb_vc_ref(vcp);
*vcpp = vcp;
}
- return error;
+ return (error);
}
int
@@ -413,39 +414,53 @@ smb_vc_create(struct smb_vcspec *vcspec,
vcp->vc_grp = gid;
smb_sl_init(&vcp->vc_stlock, "vcstlock");
- error = 0;
- itry {
- vcp->vc_paddr = dup_sockaddr(vcspec->sap, 1);
- ierror(vcp->vc_paddr == NULL, ENOMEM);
-
- vcp->vc_laddr = dup_sockaddr(vcspec->lap, 1);
- ierror(vcp->vc_laddr == NULL, ENOMEM);
-
- ierror((vcp->vc_pass = smb_strdup(vcspec->pass)) == NULL, ENOMEM);
-
- vcp->vc_domain = smb_strdup((domain && domain[0]) ? domain : "NODOMAIN");
- ierror(vcp->vc_domain == NULL, ENOMEM);
-
- ierror((vcp->vc_srvname = smb_strdup(vcspec->srvname)) == NULL, ENOMEM);
- ierror((vcp->vc_username = smb_strdup(vcspec->username)) == NULL, ENOMEM);
-
- ithrow(iconv_open("tolower", vcspec->localcs, &vcp->vc_tolower));
- ithrow(iconv_open("toupper", vcspec->localcs, &vcp->vc_toupper));
- if (vcspec->servercs[0]) {
- ithrow(iconv_open(vcspec->servercs, vcspec->localcs,
- &vcp->vc_toserver));
- ithrow(iconv_open(vcspec->localcs, vcspec->servercs,
- &vcp->vc_tolocal));
- }
-
- ithrow(smb_iod_create(vcp));
- *vcpp = vcp;
- smb_co_addchild(&smb_vclist, VCTOCP(vcp));
- } icatch(error) {
- smb_vc_put(vcp, scred);
- } ifinally {
- } iendtry;
- return error;
+ error = ENOMEM;
+
+ vcp->vc_paddr = dup_sockaddr(vcspec->sap, 1);
+ if (vcp->vc_paddr == NULL)
+ goto fail;
+ vcp->vc_laddr = dup_sockaddr(vcspec->lap, 1);
+ if (vcp->vc_laddr == NULL)
+ goto fail;
+ vcp->vc_pass = smb_strdup(vcspec->pass);
+ if (vcp->vc_pass == NULL)
+ goto fail;
+ vcp->vc_domain = smb_strdup((domain && domain[0]) ? domain :
+ "NODOMAIN");
+ if (vcp->vc_domain == NULL)
+ goto fail;
+ vcp->vc_srvname = smb_strdup(vcspec->srvname);
+ if (vcp->vc_srvname == NULL)
+ goto fail;
+ vcp->vc_username = smb_strdup(vcspec->username);
+ if (vcp->vc_username == NULL)
+ goto fail;
+ error = (int)iconv_open("tolower", vcspec->localcs, &vcp->vc_tolower);
+ if (error)
+ goto fail;
+ error = (int)iconv_open("toupper", vcspec->localcs, &vcp->vc_toupper);
+ if (error)
+ goto fail;
+ if (vcspec->servercs[0]) {
+ error = (int)iconv_open(vcspec->servercs, vcspec->localcs,
+ &vcp->vc_toserver);
+ if (error)
+ goto fail;
+ error = (int)iconv_open(vcspec->localcs, vcspec->servercs,
+ &vcp->vc_tolocal);
+ if (error)
+ goto fail;
+ }
+ error = (int)smb_iod_create(vcp);
+ if (error)
+ goto fail;
+ *vcpp = vcp;
+ smb_co_addchild(&smb_vclist, VCTOCP(vcp));
+ return (0);
+
+ fail:
+ smb_vc_put(vcp, scred);
+ return (error);
}
static void
OpenPOWER on IntegriCloud