diff options
Diffstat (limited to 'csci5271')
-rw-r--r-- | csci5271/hw1/hw1markup.md | 43 | ||||
-rwxr-xr-x | csci5271/hw1/hw1p2a.pl | 12 | ||||
-rw-r--r-- | csci5271/hw1/hw1p2b.c | 28 | ||||
-rw-r--r-- | csci5271/hw1/hw1p4.c | 27 |
4 files changed, 110 insertions, 0 deletions
diff --git a/csci5271/hw1/hw1markup.md b/csci5271/hw1/hw1markup.md new file mode 100644 index 0000000..a870d15 --- /dev/null +++ b/csci5271/hw1/hw1markup.md @@ -0,0 +1,43 @@ +# Homework 1 +## Q1 + +## Q2 +### A: Perl +After adding a name to the request, add a semicolon followed by the command. The semicolon is the shell command separator which allows it to parse commands. +#### Example Request +``` +"?field-name=;perl+-e+'`command`'" +``` +### B: C + +## Q3 + +## Q4 +### A +#### Mistake 1a: Potentially overloading the array +If the function is called with `to` larger than outer bound of the array, there is a buffer overflow that happens. For example, running it by default with an array of size 10 with a `to` of size 11 on gcc 11.1 causes it to crash because of stack smashing. +##### Mistake 1b: Underloading the array +If the function is called with `from` smaller than 0 will cause some values of the array to be replaced with other values from memory. It did not crash, but it is not the intended behavior. +#### Mistake 2: + +#### Mistake 3: + +### B: Same Signature +```c + void reverse_range(int *a, int from, int to) { + +``` +### C: Different Signature +```c + int* reverse_range(int arr[], int arrSize, int from, int to) { + if (from < 0 || to >= arrSize) + return NULL; + for (int i = from; i < to; i++) { + int temp = arr[i]; + arr[i] = arr[to]; + arr[to] = temp; + to--; + } + return arr; +``` +## Q5
\ No newline at end of file diff --git a/csci5271/hw1/hw1p2a.pl b/csci5271/hw1/hw1p2a.pl new file mode 100755 index 0000000..a8bfe2e --- /dev/null +++ b/csci5271/hw1/hw1p2a.pl @@ -0,0 +1,12 @@ +#!/usr/bin/perl +print "Content-Type: text/html\r\n\r\n"; +print "<HTML><BODY>\n"; +($field_name, $username_to_look_for) = split(/=/, <>); +chomp $username_to_look_for; +$result = `last -1000 | grep $username_to_look_for`; +if ($result) { +print "$username_to_look_for has logged in recently.\n"; +} else { +print "$username_to_look_for has NOT logged in recently.\n"; +} +print "</BODY></HTML>\n";
\ No newline at end of file diff --git a/csci5271/hw1/hw1p2b.c b/csci5271/hw1/hw1p2b.c new file mode 100644 index 0000000..df5ac73 --- /dev/null +++ b/csci5271/hw1/hw1p2b.c @@ -0,0 +1,28 @@ +#include <fcntl.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <unistd.h> +void silly_function(char *pathname) { + struct stat f, we; + int rfd, wfd; + char *buf; + stat(pathname, &f); + stat("./critical", &we); + if (f.st_dev == we.st_dev && f.st_ino == we.st_ino) { + return; + } + rfd = open(pathname, O_RDONLY); + buf = malloc(f.st_size - 1); + read(rfd, buf, f.st_size - 1); + close(rfd); + stat(pathname, &f); + if (f.st_dev == we.st_dev && f.st_ino == we.st_ino) { + return; + } + wfd = open(pathname, O_WRONLY | O_TRUNC); + write(wfd, buf, f.st_size - 1); + close(wfd); + free(buf); +} + +int main() { silly_function("./not"); }
\ No newline at end of file diff --git a/csci5271/hw1/hw1p4.c b/csci5271/hw1/hw1p4.c new file mode 100644 index 0000000..e449de5 --- /dev/null +++ b/csci5271/hw1/hw1p4.c @@ -0,0 +1,27 @@ +#include <stdio.h> + +/* Reverse the elements from FROM to TO, inclusive */ +void reverse_range(int *a, int from, int to) { + unsigned int *p = &a[from]; + unsigned int *q = &a[to]; + /* Until the pointers move past each other: */ + while (!(p == q + 1 || p == q + 2)) { + /* Swap *p with *q, without using a temporary variable */ + *p += *q; /* *p == P + Q */ + *q = *p - *q; /* *q == P + Q - Q = P */ + *p = *p - *q; /* *p == P + Q - P = Q */ + /* Advance pointers towards each other */ + p++; + q--; + } +} +int main() { + int a[10] = {255, 0, -65536, 2147483647, -2147483648, + -1, 0, 1, 2, 3}; + reverse_range(a, 0, 9); + for (int i = 0; i < 10; i++) { + printf("%d ", a[i]); + } + printf("\n"); + return 0; +}
\ No newline at end of file |