mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Merge remote-tracking branch 'teor/bug13111-empty-key-files-fn-empty'
This commit is contained in:
@@ -823,6 +823,7 @@ replace_file(const char *from, const char *to)
|
||||
case FN_NOENT:
|
||||
break;
|
||||
case FN_FILE:
|
||||
case FN_EMPTY:
|
||||
if (unlink(to)) return -1;
|
||||
break;
|
||||
case FN_ERROR:
|
||||
|
||||
+24
-8
@@ -2018,15 +2018,24 @@ clean_name_for_stat(char *name)
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Return FN_ERROR if filename can't be read, FN_NOENT if it doesn't
|
||||
* exist, FN_FILE if it is a regular file, or FN_DIR if it's a
|
||||
* directory. On FN_ERROR, sets errno. */
|
||||
/** Return:
|
||||
* FN_ERROR if filename can't be read, is NULL, or is zero-length,
|
||||
* FN_NOENT if it doesn't exist,
|
||||
* FN_FILE if it is a non-empty regular file, or a FIFO on unix-like systems,
|
||||
* FN_EMPTY for zero-byte regular files,
|
||||
* FN_DIR if it's a directory, and
|
||||
* FN_ERROR for any other file type.
|
||||
* On FN_ERROR and FN_NOENT, sets errno. (errno is not set when FN_ERROR
|
||||
* is returned due to an unhandled file type.) */
|
||||
file_status_t
|
||||
file_status(const char *fname)
|
||||
{
|
||||
struct stat st;
|
||||
char *f;
|
||||
int r;
|
||||
if (!fname || strlen(fname) == 0) {
|
||||
return FN_ERROR;
|
||||
}
|
||||
f = tor_strdup(fname);
|
||||
clean_name_for_stat(f);
|
||||
log_debug(LD_FS, "stat()ing %s", f);
|
||||
@@ -2038,16 +2047,23 @@ file_status(const char *fname)
|
||||
}
|
||||
return FN_ERROR;
|
||||
}
|
||||
if (st.st_mode & S_IFDIR)
|
||||
if (st.st_mode & S_IFDIR) {
|
||||
return FN_DIR;
|
||||
else if (st.st_mode & S_IFREG)
|
||||
return FN_FILE;
|
||||
} else if (st.st_mode & S_IFREG) {
|
||||
if (st.st_size > 0) {
|
||||
return FN_FILE;
|
||||
} else if (st.st_size == 0) {
|
||||
return FN_EMPTY;
|
||||
} else {
|
||||
return FN_ERROR;
|
||||
}
|
||||
#ifndef _WIN32
|
||||
else if (st.st_mode & S_IFIFO)
|
||||
} else if (st.st_mode & S_IFIFO) {
|
||||
return FN_FILE;
|
||||
#endif
|
||||
else
|
||||
} else {
|
||||
return FN_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/** Check whether <b>dirname</b> exists and is private. If yes return 0. If
|
||||
|
||||
+1
-1
@@ -342,7 +342,7 @@ enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count);
|
||||
|
||||
/** Return values from file_status(); see that function's documentation
|
||||
* for details. */
|
||||
typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR } file_status_t;
|
||||
typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR, FN_EMPTY } file_status_t;
|
||||
file_status_t file_status(const char *filename);
|
||||
|
||||
/** Possible behaviors for check_private_dir() on encountering a nonexistent
|
||||
|
||||
Reference in New Issue
Block a user