Windows: NetrShareGetInfo no return buffer on error
authorJeffrey Altman <jaltman@your-file-system.com>
Mon, 6 Jul 2015 05:38:01 +0000 (01:38 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Wed, 23 Sep 2015 19:39:29 +0000 (15:39 -0400)
When processing the NetrShareGetInfo() pipe service rpc do not
allocate memory for the return buffer is the path cannot be found.

Change-Id: I782df44de4d6b7a4664234ae0f8295294b889469
Reviewed-on: http://gerrit.openafs.org/11923
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsd/rpc_srvsvc.c

index 6ad1646..5a403cc 100644 (file)
@@ -735,22 +735,7 @@ NET_API_STATUS NetrShareGetInfo(
 
     dscp = cm_RootSCachep(userp, &req);
 
-    /* Allocate the memory for the response */
-    switch (Level) {
-    case 2:
-        InfoStruct->ShareInfo2 = MIDL_user_allocate(sizeof(SHARE_INFO_2));
-        break;
-    case 1:
-        InfoStruct->ShareInfo1 = MIDL_user_allocate(sizeof(SHARE_INFO_1));
-        break;
-    case 0:
-        InfoStruct->ShareInfo0 = MIDL_user_allocate(sizeof(SHARE_INFO_0));
-        break;
-    }
-
-    if (InfoStruct->ShareInfo0 == NULL) {
-        return ERROR_NOT_ENOUGH_MEMORY;
-    }
+    InfoStruct->ShareInfo0 = NULL;
 
     /*
      * NetName will be:
@@ -850,6 +835,33 @@ NET_API_STATUS NetrShareGetInfo(
     }
 
     if (scp) {
+       /* Allocate the memory for the response */
+       switch (Level) {
+       case 2:
+           InfoStruct->ShareInfo2 = MIDL_user_allocate(sizeof(SHARE_INFO_2));
+           break;
+       case 1:
+           InfoStruct->ShareInfo1 = MIDL_user_allocate(sizeof(SHARE_INFO_1));
+           break;
+       case 0:
+           InfoStruct->ShareInfo0 = MIDL_user_allocate(sizeof(SHARE_INFO_0));
+           break;
+       case 501:
+       case 502:
+       case 503:
+       case 1004:
+       case 1005:
+       case 1006:
+       default:
+           cm_ReleaseSCache(scp);
+           return HRESULT_FROM_WIN32(ERROR_INVALID_LEVEL);
+       }
+
+       if (InfoStruct->ShareInfo0 == NULL) {
+           cm_ReleaseSCache(scp);
+           return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
+       }
+
         switch (Level) {
         case 2:
             /* for share level security */