Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / ntoskrnl / ob / oblink.c
index af95e48..2631bd7 100644 (file)
@@ -285,7 +285,7 @@ ObpCreateSymbolicLinkName(IN POBJECT_SYMBOLIC_LINK SymbolicLink)
                 DriveType = DOSDEVICE_DRIVE_REMOTE;
                 break;
             default:
-                DPRINT1("Device Type %ld for %wZ is not known or unhandled\n",
+                DPRINT1("Device Type %lu for %wZ is not known or unhandled\n",
                         ((PDEVICE_OBJECT)Object)->DeviceType,
                         &SymbolicLink->LinkTarget);
                 DriveType = DOSDEVICE_DRIVE_UNKNOWN;
@@ -452,7 +452,7 @@ ObpParseSymbolicLink(IN PVOID ParsedObject,
         MaximumLength = LengthUsed + sizeof(WCHAR);
         NewTargetPath = ExAllocatePoolWithTag(NonPagedPool,
                                               MaximumLength,
-                                              TAG_SYMLINK_TTARGET);
+                                              OB_NAME_TAG);
         if (!NewTargetPath) return STATUS_INSUFFICIENT_RESOURCES;
     }
     else
@@ -589,18 +589,31 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
 
         /* Setup the target name */
         SymbolicLink->LinkTarget.Length = CapturedLinkTarget.Length;
-        SymbolicLink->LinkTarget.MaximumLength = CapturedLinkTarget.Length +
-                                                 sizeof(WCHAR);
+        SymbolicLink->LinkTarget.MaximumLength = CapturedLinkTarget.MaximumLength;
         SymbolicLink->LinkTarget.Buffer =
             ExAllocatePoolWithTag(PagedPool,
                                   CapturedLinkTarget.MaximumLength,
                                   TAG_SYMLINK_TARGET);
-        if (!SymbolicLink->LinkTarget.Buffer) return STATUS_NO_MEMORY;
+        if (!SymbolicLink->LinkTarget.Buffer)
+        {
+            /* Dereference the symbolic link object and fail */
+            ObDereferenceObject(SymbolicLink);
+            return STATUS_NO_MEMORY;
+        }
 
         /* Copy it */
-        RtlCopyMemory(SymbolicLink->LinkTarget.Buffer,
-                      CapturedLinkTarget.Buffer,
-                      CapturedLinkTarget.MaximumLength);
+        _SEH2_TRY
+        {
+            RtlCopyMemory(SymbolicLink->LinkTarget.Buffer,
+                          CapturedLinkTarget.Buffer,
+                          CapturedLinkTarget.MaximumLength);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            ObDereferenceObject(SymbolicLink);
+            _SEH2_YIELD(return _SEH2_GetExceptionCode());
+        }
+        _SEH2_END;
 
         /* Initialize the remaining name, dos drive index and target object */
         SymbolicLink->LinkTargetObject = NULL;
@@ -689,20 +702,18 @@ NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
                                 DesiredAccess,
                                 NULL,
                                 &hLink);
-    if (NT_SUCCESS(Status))
+
+    _SEH2_TRY
     {
-        _SEH2_TRY
-        {
-            /* Return the handle to caller */
-            *LinkHandle = hLink;
-        }
-        _SEH2_EXCEPT(ExSystemExceptionFilter())
-        {
-            /* Get exception code */
-            Status = _SEH2_GetExceptionCode();
-        }
-        _SEH2_END;
+        /* Return the handle to caller */
+        *LinkHandle = hLink;
+    }
+    _SEH2_EXCEPT(ExSystemExceptionFilter())
+    {
+        /* Get exception code */
+        Status = _SEH2_GetExceptionCode();
     }
+    _SEH2_END;
 
     /* Return status to caller */
     return Status;