From 0096f30d28bbe8ede33e52950f9ac31e28492614 Mon Sep 17 00:00:00 2001
From: Terence Denning <terrencedenning@gmail.com>
Date: Thu, 18 Apr 2019 17:49:47 +1000
Subject: [PATCH] fixed memory bug on discarded page

---
 http-server.c |  99 +++++++++++++++++++++++++++++++++++++++++---------
 server        | Bin 18304 -> 18304 bytes
 2 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/http-server.c b/http-server.c
index 13af679..cf3a91f 100644
--- a/http-server.c
+++ b/http-server.c
@@ -55,7 +55,7 @@ static bool handle_http_request(int sockfd)
     // try to read the request
     char buff[2049];
     int n = read(sockfd, buff, 2049);
-    printf("%s\n", buff);
+    
     if (n <= 0)
     {
         if (n < 0)
@@ -136,29 +136,87 @@ static bool handle_http_request(int sockfd)
         }
         else if (method == POST)
         {
-            // locate the username, it is safe to do so in this sample code, but usually the result is expected to be
-            // copied to another buffer using strcpy or strncpy to ensure that it will not be overwritten.
-            char * username = strstr(buff, "user=") + 5;
-            int username_length = strlen(username);
-            // the length needs to include the ", " before the username
-            long added_length = username_length + 2;
-            
-            // Set sockfd to a user
-            if( user1 == -1 ){
+            char *username;
+            int username_length;
+            long added_length;
+            long size;
+
+            // Set User
+            if( (user1 == -1) && (sockfd != user2) ){
                 user1 = sockfd;
-            } else if( user2 == -1 ){
+            } else if( (user2 == -1) && (sockfd != user1) ){
                 user2 = sockfd;
             }
-
-            webpage = "html/2_start.html";
+            webpage = "html/2_start.html";            
 
             // get the size of the file
             struct stat st;
-            stat(webpage, &st);
 
-            // increase file size to accommodate the username
-            long size = st.st_size + added_length;
-            n = sprintf(buff, HTTP_200_FORMAT, size);
+            if(strstr(buff, "quit=Quit") != NULL){
+                stat(webpage, &st);
+                // Reset User
+                if(sockfd == user1){
+                    user1 = -1;
+                    user1_start = 0;
+                } else if(sockfd == user2){
+                    user2 = -1;
+                    user2_start = 0;
+                } else {
+                    printf("Sockfd not set for some reason..\n\n");
+                }
+
+                n = sprintf(buff, HTTP_200_FORMAT, st.st_size);
+                if (write(sockfd, buff, n) < 0)
+                {
+                    perror("write");
+                    return false;
+                }
+                webpage = "html/1_intro.html";
+                int filefd = open(webpage, O_RDONLY);
+                n = read(filefd, buff, 2048);
+                if (n < 0)
+                {
+                    perror("read");
+                    close(filefd);
+                    return false;
+                }
+                close(filefd);
+                stat(webpage, &st);
+                if (write(sockfd, buff, st.st_size) < 0)
+                {
+                    perror("write");
+                    return false;
+                }
+            } else if(strstr(buff, "user=") != NULL){
+                stat(webpage, &st);
+                username = strstr(buff, "user=") + 5;
+                username_length = strlen(username);
+                added_length = username_length + 2;
+                size = st.st_size + added_length;
+                n = sprintf(buff, HTTP_200_FORMAT, size);
+            }
+            else if(strstr(buff, "guess=Guess") != NULL) {     
+                if(sockfd == user1){
+                    if(user2_start == 1){
+                        webpage = "html/4_accepted.html";
+                    } else {
+                        webpage = "html/5_discarded.html";
+                    }
+                } else if(sockfd == user2){
+                    if(user1_start == 1){
+                        webpage = "html/4_accepted.html";
+                    } else {
+                        webpage = "html/5_discarded.html";
+                    }
+                } else {
+                    printf("No one is logged in..");
+                }
+                stat(webpage, &st);
+                n = sprintf(buff, HTTP_200_FORMAT, st.st_size);
+                
+            } else {
+                printf("\n\n\nerror reading html...\n\n\n");
+            }
 
             // send the header first
             if (write(sockfd, buff, n) < 0)
@@ -169,6 +227,7 @@ static bool handle_http_request(int sockfd)
             // read the content of the HTML file
             int filefd = open(webpage, O_RDONLY);
             n = read(filefd, buff, 2048);
+            
             if (n < 0)
             {
                 perror("read");
@@ -177,7 +236,7 @@ static bool handle_http_request(int sockfd)
             }
             close(filefd);
 
-            if(strlen(username) > 0){
+            if((strlen(username) > 0) && (strstr(buff, "user=") != NULL) ){
                 // move the trailing part backward
                 int p1, p2;
                 for (p1 = size - 1, p2 = p1 - added_length; p1 >= size - 25; --p1, --p2)
@@ -193,6 +252,10 @@ static bool handle_http_request(int sockfd)
                     perror("write");
                     return false;
                 }
+            } else {
+                printf("%s\n", buff);
+                write(sockfd, buff, st.st_size);
+                
             }
         } 
         else {
diff --git a/server b/server
index fc50a3489cdca35b6da89c6b3962d7536bcc09c3..0231189ab0ac23a3fdeca41a12affc70eed35476 100755
GIT binary patch
delta 3318
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
JoaOS22>^Qer@a6G

delta 2253
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
Q11Q`W7(niv<?@UP0PVcNU;qFB

-- 
GitLab