Pārlūkot izejas kodu

Reorder mg_upload

bel 10 gadi atpakaļ
vecāks
revīzija
edcf6b2d79
1 mainītis faili ar 29 papildinājumiem un 26 dzēšanām
  1. 29 26
      src/civetweb.c

+ 29 - 26
src/civetweb.c

@@ -5560,15 +5560,6 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
             break;
         }
 
-        /* Move data to the beginning of the buffer */
-        assert(len >= headers_len);
-        memmove(buf, &buf[headers_len], len - headers_len);
-        len -= headers_len;
-
-        /* We open the file with exclusive lock held. This guarantee us
-           there is no other thread can save into the same file
-           simultaneously. */
-        fp = NULL;
         /* Construct destination file name. Do not allow paths to have
            slashes. */
         if ((s = strrchr(fname, '/')) == NULL &&
@@ -5578,16 +5569,27 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
             s++;
         }
 
-        /* Open file in binary mode. */
         /* There data is written to a temporary file first. */
         /* Different users should use a different destination_dir. */
         snprintf(path, sizeof(path)-1, "%s/%s", destination_dir, s);
         strcpy(tmp_path, path);
         strcat(tmp_path, "~");
+
+        /* We open the file with exclusive lock held. This guarantee us
+           there is no other thread can save into the same file
+           simultaneously. */
+        fp = NULL;
+        /* Open file in binary mode. */
         if ((fp = fopen(tmp_path, "wb")) == NULL) {
             break;
         }
 
+        /* Move data to the beginning of the buffer */
+        /* part_request_info is no longer valid after this operation */
+        assert(len >= headers_len);
+        memmove(buf, &buf[headers_len], len - headers_len);
+        len -= headers_len;
+
         /* Read POST data, write into file until boundary is found. */
         eof = n = 0;
         do {
@@ -5611,14 +5613,14 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
         } while (!eof && (n = mg_read(conn, buf + len, sizeof(buf) - len)) > 0);
         fclose(fp);
         if (eof) {
-            remove(path);
+            remove(path);
             rename(tmp_path, path);
             num_uploaded_files++;
             if (conn->ctx->callbacks.upload != NULL) {
                 conn->ctx->callbacks.upload(conn, path);
             }
-        } else {
-            remove(tmp_path);
+        } else {
+            remove(tmp_path);
         }
     }
 
@@ -5978,6 +5980,7 @@ static int set_ports_option(struct mg_context *ctx)
     union usa usa;
     socklen_t len;
 
+    memset(&so, 0, sizeof(so));
     memset(&usa, 0, sizeof(usa));
     len = sizeof(usa);
 
@@ -6512,19 +6515,19 @@ static int is_valid_uri(const char *uri)
 static int getreq(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int timeout)
 {
     const char *cl;
-    struct pollfd pfd;
-
-    reset_per_request_attributes(conn);
-    if (timeout >= 0) {
-        pfd.fd = conn->client.sock;
-        switch (poll(&pfd, 1, timeout)) {
-        case 0:
-            snprintf(ebuf, ebuf_len, "%s", "Timed out");
-            return 0;
-        case -1:
-            snprintf(ebuf, ebuf_len, "%s", "Interrupted");
-            return 0;
-        }
+    struct pollfd pfd;
+
+    reset_per_request_attributes(conn);
+    if (timeout >= 0) {
+        pfd.fd = conn->client.sock;
+        switch (poll(&pfd, 1, timeout)) {
+        case 0:
+            snprintf(ebuf, ebuf_len, "%s", "Timed out");
+            return 0;
+        case -1:
+            snprintf(ebuf, ebuf_len, "%s", "Interrupted");
+            return 0;
+        }
     }
 
     ebuf[0] = '\0';