Don Porter 7 years ago
parent
commit
f46ea38769
4 changed files with 82 additions and 3 deletions
  1. 3 2
      Pal/lib/graphene/path.c
  2. 71 0
      Pal/regression/..Bootstrap.c
  3. 7 0
      Pal/regression/00_Bootstrap.py
  4. 1 1
      Pal/regression/Makefile

+ 3 - 2
Pal/lib/graphene/path.c

@@ -54,8 +54,9 @@ int get_norm_path (const char * path, char * buf, int offset, int size)
                     continue;
                 if (c1 == '.') {    /* must be dot-dot */
                     c1 = *(++p);
-                    if (c1 != 0 && c1 != '/')   /* must be the end or a slash */
-                        return -PAL_ERROR_INVAL;
+                    if (c1 != 0 && c1 != '/')   /* Paths can start with a dot
+                                                 * dot: ..xyz is ok */
+                        continue;
                     if (offset > head) {    /* remove the last token */
                         while (offset > head && buf[--offset] != '/');
                     } else {

+ 71 - 0
Pal/regression/..Bootstrap.c

@@ -0,0 +1,71 @@
+/* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
+/* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
+
+#include "pal.h"
+#include "pal_debug.h"
+
+static int test_data = 0;
+static int test_func (void) { return 0; }
+
+int main (int argc, char ** argv, char ** envp)
+{
+    /* check if the program is loaded */
+    pal_printf("User Program Started\n");
+
+    /* check control block */
+    /* check executable name */
+    pal_printf("Loaded Executable: %s\n", pal_control.executable);
+
+    /* check manifest name */
+    char manifest[30] = "";
+    DkStreamGetName(pal_control.manifest_handle, manifest, 30);
+    pal_printf("Loaded Manifest: %s\n", manifest);
+
+    /* check arguments */
+    pal_printf("# of Arguments: %d\n", argc);
+    for (int i = 0 ; i < argc ; i++)
+        pal_printf("argv[%d] = %s\n", i, argv[i]);
+
+    /* unique process ID */
+    pal_printf("Process ID: %016x\n", pal_control.process_id);
+
+    /* unique host ID */
+    pal_printf("Host ID: %016x\n", pal_control.host_id);
+
+    /* parent process */
+    pal_printf("Parent Process: %016lx\n", pal_control.parent_process);
+
+    /* test debug stream */
+    char msg[] = "Written to Debug Stream\n";
+    DkStreamWrite(pal_control.debug_stream, 0, sizeof(msg), msg, NULL);
+
+    /* page size */
+    pal_printf("Page Size: %d\n", pal_control.pagesize);
+    /* Allocation Alignment */
+    pal_printf("Allocation Alignment: %d\n", pal_control.alloc_align);
+
+    /* user address range */
+    pal_printf("User Address Range: %p - %p\n",
+               pal_control.user_address.start,
+               pal_control.user_address.end);
+
+    if (pal_control.user_address.start &&
+        pal_control.user_address.end &&
+        pal_control.user_address.start < pal_control.user_address.end)
+        pal_printf("User Address Range OK\n");
+
+    /* executable address range */
+    pal_printf("Executable Range: %p - %p\n",
+               pal_control.executable_range.start,
+               pal_control.executable_range.end);
+
+    if (pal_control.executable_range.start &&
+        pal_control.executable_range.end &&
+        pal_control.executable_range.start < (void *) &test_data &&
+        (void *) &test_data < pal_control.executable_range.end &&
+        pal_control.executable_range.start < (void *) &test_func &&
+        (void *) &test_func < pal_control.executable_range.end)
+        pal_printf("Executable Range OK\n");
+
+    return 0;
+}

+ 7 - 0
Pal/regression/00_Bootstrap.py

@@ -44,6 +44,13 @@ regression.add_check(name="Control Block: Executable Range",
 
 regression.run_checks()
 
+# Running ..Bootstrap
+regression = Regression(loader, "..Bootstrap")
+
+regression.add_check(name="Dotdot handled properly",
+    check=lambda res: "User Program Started" in res[0].log)
+regression.run_checks()
+
 # Running Bootstrap2
 regression = Regression(loader, "Bootstrap2")
 

+ 1 - 1
Pal/regression/Makefile

@@ -5,7 +5,7 @@ CFLAGS	= -Wall -O2 -std=gnu99 -fgnu89-inline -fno-builtin -nostdlib \
 	  -I../include/pal -I../lib
 
 preloads    = $(patsubst %.c,%,$(wildcard *.so.c))
-executables = $(filter-out $(preloads),$(patsubst %.c,%,$(wildcard *.c)))
+executables = $(filter-out $(preloads),$(patsubst %.c,%,$(wildcard *.c))) ..Bootstrap
 manifests   = manifest $(patsubst %.manifest.template,%.manifest,$(wildcard *.manifest.template))
 
 target = $(executables) $(manifests)