title: Seg fault with open command when trying to open very large file
body: <p>I'm taking a networking class at school and am using C/GDB for the first time. Our assignment is to make a webserver that communicates with a client browser. I am well underway and can open files and send them to the client. Everything goes great till I open a very large file and then I seg fault. I'm not a pro at C/GDB so I'm sorry if that is causing me to ask silly questions and not be able to see the solution myself but when I looked at the dumped core I see my seg fault comes here:</p>
  
  <pre><code>if (-1 == (openfd = open(path, O_RDONLY)))
  </code></pre>
  
  <p>Specifically we are tasked with opening the file and the sending it to the client browser. My Algorithm goes:</p>
  
  <ol>
  <li>Open/Error catch</li>
  <li>Read the file into a buffer/Error catch</li>
  <li>Send the file</li>
  </ol>
  
  <p>We were also tasked with making sure that the server doesn't crash when SENDING very large files. But my problem seems to be with opening them. I can send all my smaller files just fine. The file in question is 29.5MB.</p>
  
  <p>The whole algorithm is:</p>
  
  <pre><code>ssize_t send_file(int conn, char *path, int len, int blksize, char *mime) {
    int openfd; // File descriptor for file we open at path
    int temp; // Counter for the size of the file that we send
    char buffer[len]; // Buffer to read the file we are opening that is len big
  
    // Open the file
    if (-1 == (openfd = open(path, O_RDONLY))) {
      send_head(conn, "", 400, strlen(ERROR_400));
      (void) send(conn, ERROR_400, strlen(ERROR_400), 0);
      logwrite(stdout, CANT_OPEN);
      return -1;
    }
  
    // Read from file
    if (-1 == read(openfd, buffer, len)) {
      send_head(conn, "", 400, strlen(ERROR_400));
      (void) send(conn, ERROR_400, strlen(ERROR_400), 0);
      logwrite(stdout, CANT_OPEN);
      return -1;
    }
    (void) close(openfd);
  
    // Send the buffer now
    logwrite(stdout, SUC_REQ);
    send_head(conn, mime, 200, len);      
    send(conn, &amp;buffer[0], len, 0);
    return len;
  }
  </code></pre>
  
  <p>I dunno if it is just a fact that a I am Unix/C novice. Sorry if it is. =( But you're help is much appreciated.</p>