|
@@ -3676,9 +3676,14 @@ push(struct mg_context *ctx,
|
|
|
*/
|
|
|
return -1;
|
|
|
}
|
|
|
+
|
|
|
+ /* This code is not reached in the moment.
|
|
|
+ * ==> Fix the TODOs above first. */
|
|
|
+
|
|
|
if (timeout > 0) {
|
|
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
}
|
|
|
+
|
|
|
} while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout));
|
|
|
|
|
|
(void)err; /* Avoid unused warning if NO_SSL is set and DEBUG_TRACE is not
|
|
@@ -6531,6 +6536,16 @@ put_dir(struct mg_connection *conn, const char *path)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static void
|
|
|
+remove_bad_file(const struct mg_connection *conn, const char *path)
|
|
|
+{
|
|
|
+ int r = mg_remove(path);
|
|
|
+ if (r != 0) {
|
|
|
+ mg_cry(conn, "%s: Cannot remove invalid file %s", __func__, path);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
long long
|
|
|
mg_store_body(struct mg_connection *conn, const char *path)
|
|
|
{
|
|
@@ -6564,7 +6579,7 @@ mg_store_body(struct mg_connection *conn, const char *path)
|
|
|
n = (int)fwrite(buf, 1, (size_t)ret, fi.fp);
|
|
|
if (n != ret) {
|
|
|
fclose(fi.fp);
|
|
|
- remove(path);
|
|
|
+ remove_bad_file(conn, path);
|
|
|
return -13;
|
|
|
}
|
|
|
ret = mg_read(conn, buf, sizeof(buf));
|
|
@@ -6573,7 +6588,7 @@ mg_store_body(struct mg_connection *conn, const char *path)
|
|
|
/* TODO: mg_fclose should return an error,
|
|
|
* and every caller should check and handle it. */
|
|
|
if (fclose(fi.fp) != 0) {
|
|
|
- remove(path);
|
|
|
+ remove_bad_file(conn, path);
|
|
|
return -14;
|
|
|
}
|
|
|
|
|
@@ -8116,7 +8131,7 @@ handle_propfind(struct mg_connection *conn,
|
|
|
|
|
|
gmt_time_string(date, sizeof(date), &curtime);
|
|
|
|
|
|
- if (!conn || !path || !filep) {
|
|
|
+ if (!conn || !path || !filep || !conn->ctx) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -8141,7 +8156,7 @@ handle_propfind(struct mg_connection *conn,
|
|
|
print_props(conn, conn->request_info.local_uri, filep);
|
|
|
|
|
|
/* If it is a directory, print directory entries too if Depth is not 0 */
|
|
|
- if (filep && conn->ctx && filep->is_directory
|
|
|
+ if (filep && filep->is_directory
|
|
|
&& !mg_strcasecmp(conn->ctx->config[ENABLE_DIRECTORY_LISTING], "yes")
|
|
|
&& (depth == NULL || strcmp(depth, "0") != 0)) {
|
|
|
scan_directory(conn, path, conn, &print_dav_dir_entry);
|
|
@@ -9047,6 +9062,23 @@ mg_upload_field_found(const char *key,
|
|
|
|
|
|
/* Helper function for deprecated mg_upload. */
|
|
|
static int
|
|
|
+mg_upload_field_get(const char *key,
|
|
|
+ const char *value,
|
|
|
+ size_t value_size,
|
|
|
+ void *user_data)
|
|
|
+{
|
|
|
+ /* Function should never be called */
|
|
|
+ (void)key;
|
|
|
+ (void)value;
|
|
|
+ (void)value_size;
|
|
|
+ (void)user_data;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/* Helper function for deprecated mg_upload. */
|
|
|
+static int
|
|
|
mg_upload_field_stored(const char *path, size_t file_size, void *user_data)
|
|
|
{
|
|
|
struct mg_upload_user_data *fud = (struct mg_upload_user_data *)user_data;
|
|
@@ -9065,7 +9097,7 @@ mg_upload(struct mg_connection *conn, const char *destination_dir)
|
|
|
{
|
|
|
struct mg_upload_user_data fud = {conn, destination_dir, 0};
|
|
|
struct mg_form_data_handler fdh = {mg_upload_field_found,
|
|
|
- NULL,
|
|
|
+ mg_upload_field_get,
|
|
|
mg_upload_field_stored,
|
|
|
0};
|
|
|
int ret;
|
|
@@ -10926,7 +10958,7 @@ reset_per_request_attributes(struct mg_connection *conn)
|
|
|
static int
|
|
|
set_sock_timeout(SOCKET sock, int milliseconds)
|
|
|
{
|
|
|
- int r1, r2;
|
|
|
+ int r0 = 0, r1, r2;
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
/* Windows specific */
|
|
@@ -10947,7 +10979,7 @@ set_sock_timeout(SOCKET sock, int milliseconds)
|
|
|
|
|
|
#if defined(TCP_USER_TIMEOUT)
|
|
|
unsigned int uto = (unsigned int)milliseconds;
|
|
|
- setsockopt(sock, 6, TCP_USER_TIMEOUT, (const void *)&uto, sizeof(uto));
|
|
|
+ r0 = setsockopt(sock, 6, TCP_USER_TIMEOUT, (const void *)&uto, sizeof(uto));
|
|
|
#endif
|
|
|
|
|
|
memset(&tv, 0, sizeof(tv));
|
|
@@ -10961,7 +10993,7 @@ set_sock_timeout(SOCKET sock, int milliseconds)
|
|
|
r2 = setsockopt(
|
|
|
sock, SOL_SOCKET, SO_SNDTIMEO, (SOCK_OPT_TYPE)&tv, sizeof(tv));
|
|
|
|
|
|
- return r1 || r2;
|
|
|
+ return r0 || r1 || r2;
|
|
|
}
|
|
|
|
|
|
|