fix unchecked return values from stream_open/stat_cache_get_entry

From: Stefan Bühler <stbuehler@web.de>

git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2954 152afb58-edef-0310-8abb-c4023f1b3aa9
This commit is contained in:
Stefan Bühler 2014-02-16 13:08:34 +00:00
parent b106513e58
commit 57c661c191
4 changed files with 26 additions and 14 deletions

1
NEWS
View File

@ -18,6 +18,7 @@ NEWS
* [mod_cml_lua] fix null pointer dereference
* force assertion: setting FD_CLOEXEC must work (if available)
* [network] check return value of lseek()
* fix unchecked return values from stream_open/stat_cache_get_entry
- 1.4.34
* [mod_auth] explicitly link ssl for SHA1 (fixes #2517)

View File

@ -209,12 +209,17 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
lua_State *L;
readme rm;
int ret = -1;
buffer *b = buffer_init();
buffer *b;
int header_tbl = 0;
rm.done = 0;
stream_open(&rm.st, fn);
if (-1 == stream_open(&rm.st, fn)) {
log_error_write(srv, __FILE__, __LINE__, "sbss",
"opening lua cml file ", fn, "failed:", strerror(errno));
return -1;
}
b = buffer_init();
/* push the lua file to the interpreter and see what happends */
L = luaL_newstate();
luaL_openlibs(L);

View File

@ -306,7 +306,8 @@ URIHANDLER_FUNC(mod_expire_path_handler) {
size_t len;
stat_cache_entry *sce = NULL;
stat_cache_get_entry(srv, con, con->physical.path, &sce);
/* if stat fails => sce == NULL, ignore return value */
(void) stat_cache_get_entry(srv, con, con->physical.path, &sce);
switch(mod_expire_get_offset(srv, p, ds->value, &ts)) {
case 0:
@ -316,6 +317,11 @@ URIHANDLER_FUNC(mod_expire_path_handler) {
case 1:
/* modification */
/* can't set modification based expire header if
* mtime is not available
*/
if (NULL == sce) return HANDLER_GO_ON;
expires = (ts + sce->st.st_mtime);
break;
default:

View File

@ -319,8 +319,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
return 0;
}
static int process_ssi_stmt(server *srv, connection *con, plugin_data *p,
const char **l, size_t n) {
static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const char **l, size_t n, stat_cache_entry *sce) {
size_t i, ssicmd = 0;
char buf[255];
buffer *b = NULL;
@ -360,7 +359,6 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p,
int var = 0;
/* int enc = 0; */
const char *var_val = NULL;
stat_cache_entry *sce = NULL;
struct {
const char *var;
@ -429,8 +427,6 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p,
break;
}
stat_cache_get_entry(srv, con, con->physical.path, &sce);
switch(var) {
case SSI_ECHO_USER_NAME: {
struct passwd *pw;
@ -958,6 +954,9 @@ static int mod_ssi_handle_request(server *srv, connection *con, plugin_data *p)
int ovec[N * 3];
#endif
stat_cache_entry *sce = NULL;
/* get a stream to the file */
array_reset(p->ssi_vars);
@ -970,6 +969,11 @@ static int mod_ssi_handle_request(server *srv, connection *con, plugin_data *p)
/* Reset the modified time of included files */
include_file_last_mtime = 0;
if (HANDLER_ERROR == stat_cache_get_entry(srv, con, con->physical.path, &sce)) {
log_error_write(srv, __FILE__, __LINE__, "SB", "stat_cache_get_entry failed: ", con->physical.path);
return -1;
}
if (-1 == stream_open(&s, con->physical.path)) {
log_error_write(srv, __FILE__, __LINE__, "sb",
"stream-open: ", con->physical.path);
@ -1043,7 +1047,7 @@ static int mod_ssi_handle_request(server *srv, connection *con, plugin_data *p)
if (!p->if_is_false) chunkqueue_append_file(con->write_queue, con->physical.path, i, ovec[0] - i);
pcre_get_substring_list(s.start, ovec, n, &l);
process_ssi_stmt(srv, con, p, l, n);
process_ssi_stmt(srv, con, p, l, n, sce);
pcre_free_substring_list(l);
}
@ -1074,14 +1078,10 @@ static int mod_ssi_handle_request(server *srv, connection *con, plugin_data *p)
}
{
/* Generate "ETag" & "Last-Modified" headers */
stat_cache_entry *sce = NULL;
/* Generate "ETag" & "Last-Modified" headers */
time_t lm_time = 0;
buffer *mtime = NULL;
stat_cache_get_entry(srv, con, con->physical.path, &sce);
etag_mutate(con->physical.etag, sce->etag);
response_header_overwrite(srv, con, CONST_STR_LEN("ETag"), CONST_BUF_LEN(con->physical.etag));