Fixed bugs in RtlExpandEnvironmentStrings_U() and RtlSetEnvironmentVariable()

svn path=/trunk/; revision=1018
This commit is contained in:
Eric Kohl 2000-02-27 15:45:57 +00:00
parent 6eb7010078
commit 853d9d4ae2

View file

@ -1,4 +1,4 @@
/* $Id: env.c,v 1.8 2000/02/19 19:34:49 ekohl Exp $ /* $Id: env.c,v 1.9 2000/02/27 15:45:57 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -19,6 +19,7 @@
#define NDEBUG #define NDEBUG
#include <ntdll/ntdll.h> #include <ntdll/ntdll.h>
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS NTSTATUS
@ -130,6 +131,9 @@ RtlExpandEnvironmentStrings_U (
int dst_max; int dst_max;
int tail; int tail;
DPRINT ("RtlExpandEnvironmentStrings_U %p %wZ %p %p\n",
Environment, Source, Destination, Length);
src_len = Source->Length / sizeof(WCHAR); src_len = Source->Length / sizeof(WCHAR);
s = Source->Buffer; s = Source->Buffer;
dst_max = Destination->MaximumLength / sizeof(WCHAR); dst_max = Destination->MaximumLength / sizeof(WCHAR);
@ -162,7 +166,7 @@ RtlExpandEnvironmentStrings_U (
val.MaximumLength = dst_max * sizeof(WCHAR); val.MaximumLength = dst_max * sizeof(WCHAR);
val.Buffer = d; val.Buffer = d;
Status = RtlQueryEnvironmentVariable_U (Environment, &var, &val); Status = RtlQueryEnvironmentVariable_U (Environment, &var, &val);
if (!NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
d += val.Length / sizeof(WCHAR); d += val.Length / sizeof(WCHAR);
dst_max -= val.Length / sizeof(WCHAR); dst_max -= val.Length / sizeof(WCHAR);
@ -190,6 +194,7 @@ copy:
if (dst_max) if (dst_max)
Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0;
DPRINT ("Destination %wZ\n", Destination);
return Status; return Status;
} }
@ -419,18 +424,22 @@ RtlQueryEnvironmentVariable_U (
PWSTR val; PWSTR val;
int varlen; int varlen;
int len; int len;
BOOLEAN SysEnvUsed = FALSE;
DPRINT("RtlQueryEnvironmentVariable_U Environment %p Variable %wZ Value %p\n", DPRINT("RtlQueryEnvironmentVariable_U Environment %p Variable %wZ Value %p\n",
Environment, Name, Value); Environment, Name, Value);
if (!Environment) if (Environment == NULL)
{
Environment = NtCurrentPeb()->ProcessParameters->Environment; Environment = NtCurrentPeb()->ProcessParameters->Environment;
SysEnvUsed = TRUE;
}
if (!Environment) if (Environment == NULL)
return STATUS_VARIABLE_NOT_FOUND; return STATUS_VARIABLE_NOT_FOUND;
Value->Length = 0; Value->Length = 0;
if (Environment == NtCurrentPeb()->ProcessParameters->Environment) if (SysEnvUsed == TRUE)
RtlAcquirePebLock(); RtlAcquirePebLock();
wcs = Environment; wcs = Environment;
@ -454,14 +463,16 @@ RtlQueryEnvironmentVariable_U (
{ {
wcscpy (Value->Buffer, val); wcscpy (Value->Buffer, val);
DPRINT("Value %S\n", val); DPRINT("Value %S\n", val);
DPRINT("Return STATUS_SUCCESS\n");
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
else else
{ {
DPRINT("Return STATUS_BUFFER_TOO_SMALL\n");
Status = STATUS_BUFFER_TOO_SMALL; Status = STATUS_BUFFER_TOO_SMALL;
} }
if (Environment == NtCurrentPeb()->ProcessParameters->Environment) if (SysEnvUsed == TRUE)
RtlReleasePebLock (); RtlReleasePebLock ();
return Status; return Status;
@ -470,9 +481,10 @@ RtlQueryEnvironmentVariable_U (
wcs++; wcs++;
} }
if (Environment == NtCurrentPeb()->ProcessParameters->Environment) if (SysEnvUsed == TRUE)
RtlReleasePebLock (); RtlReleasePebLock ();
DPRINT("Return STATUS_VARIABLE_NOT_FOUND\n");
return STATUS_VARIABLE_NOT_FOUND; return STATUS_VARIABLE_NOT_FOUND;
} }