mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 14:20:07 +00:00
Properly check for short writes when sending the response in nscd
* nscd/grpcache.c (cache_addgr): Properly check for short write. * nscd/initgrcache.c (addinitgroupsX): Likewise. * nscd/pwdcache.c (cache_addpw): Likewise. * nscd/servicescache.c (cache_addserv): Likewise. Don't write more than recsize.
This commit is contained in:
parent
3167bfc62b
commit
dd31ac7a8e
@ -75,6 +75,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
|
||||
const void *key, struct group *grp, uid_t owner,
|
||||
struct hashentry *const he, struct datahead *dh, int errval)
|
||||
{
|
||||
bool all_written = true;
|
||||
ssize_t total;
|
||||
ssize_t written;
|
||||
time_t t = time (NULL);
|
||||
@ -342,6 +343,9 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
|
||||
# endif
|
||||
#endif
|
||||
written = writeall (fd, &dataset->resp, dataset->head.recsize);
|
||||
|
||||
if (written != dataset->head.recsize)
|
||||
all_written = false;
|
||||
}
|
||||
|
||||
/* Add the record to the database. But only if it has not been
|
||||
@ -401,7 +405,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
|
||||
}
|
||||
}
|
||||
|
||||
if (__builtin_expect (written != total, 0) && debug_level > 0)
|
||||
if (__builtin_expect (!all_written, 0) && debug_level > 0)
|
||||
{
|
||||
char buf[256];
|
||||
dbg_log (_("short write in %s: %s"), __FUNCTION__,
|
||||
|
@ -171,10 +171,12 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
|
||||
nip = nip->next;
|
||||
}
|
||||
|
||||
bool all_written;
|
||||
ssize_t total;
|
||||
ssize_t written;
|
||||
time_t timeout;
|
||||
out:
|
||||
all_written = true;
|
||||
timeout = MAX_TIMEOUT_VALUE;
|
||||
if (!any_success)
|
||||
{
|
||||
@ -379,6 +381,9 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
|
||||
# endif
|
||||
#endif
|
||||
written = writeall (fd, &dataset->resp, dataset->head.recsize);
|
||||
|
||||
if (written != dataset->head.recsize)
|
||||
all_written = false;
|
||||
}
|
||||
|
||||
|
||||
@ -405,7 +410,7 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
|
||||
|
||||
free (groups);
|
||||
|
||||
if (__builtin_expect (written != total, 0) && debug_level > 0)
|
||||
if (__builtin_expect (!all_written, 0) && debug_level > 0)
|
||||
{
|
||||
char buf[256];
|
||||
dbg_log (_("short write in %s: %s"), __FUNCTION__,
|
||||
|
@ -81,6 +81,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||
const void *key, struct passwd *pwd, uid_t owner,
|
||||
struct hashentry *const he, struct datahead *dh, int errval)
|
||||
{
|
||||
bool all_written = true;
|
||||
ssize_t total;
|
||||
ssize_t written;
|
||||
time_t t = time (NULL);
|
||||
@ -306,7 +307,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||
+ db->head->data_size));
|
||||
written = sendfileall (fd, db->wr_fd,
|
||||
(char *) &dataset->resp
|
||||
- (char *) db->head, dataset->head.recsize );
|
||||
- (char *) db->head, dataset->head.recsize);
|
||||
# ifndef __ASSUME_SENDFILE
|
||||
if (written == -1 && errno == ENOSYS)
|
||||
goto use_write;
|
||||
@ -318,6 +319,9 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||
# endif
|
||||
#endif
|
||||
written = writeall (fd, &dataset->resp, dataset->head.recsize);
|
||||
|
||||
if (written != dataset->head.recsize)
|
||||
all_written = false;
|
||||
}
|
||||
|
||||
|
||||
@ -377,7 +381,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||
}
|
||||
}
|
||||
|
||||
if (__builtin_expect (written != total, 0) && debug_level > 0)
|
||||
if (__builtin_expect (!all_written, 0) && debug_level > 0)
|
||||
{
|
||||
char buf[256];
|
||||
dbg_log (_("short write in %s: %s"), __FUNCTION__,
|
||||
|
@ -65,6 +65,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
|
||||
const void *key, struct servent *serv, uid_t owner,
|
||||
struct hashentry *const he, struct datahead *dh, int errval)
|
||||
{
|
||||
bool all_written = true;
|
||||
ssize_t total;
|
||||
ssize_t written;
|
||||
time_t t = time (NULL);
|
||||
@ -290,14 +291,14 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
|
||||
{
|
||||
assert (db->wr_fd != -1);
|
||||
assert ((char *) &dataset->resp > (char *) db->data);
|
||||
assert ((char *) &dataset->resp - (char *) db->head
|
||||
assert ((char *) dataset - (char *) db->head
|
||||
+ total
|
||||
<= (sizeof (struct database_pers_head)
|
||||
+ db->head->module * sizeof (ref_t)
|
||||
+ db->head->data_size));
|
||||
written = sendfileall (fd, db->wr_fd,
|
||||
(char *) &dataset->resp
|
||||
- (char *) db->head, total);
|
||||
- (char *) db->head, dataset->head.recsize);
|
||||
# ifndef __ASSUME_SENDFILE
|
||||
if (written == -1 && errno == ENOSYS)
|
||||
goto use_write;
|
||||
@ -308,7 +309,10 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
|
||||
use_write:
|
||||
# endif
|
||||
#endif
|
||||
written = writeall (fd, &dataset->resp, total);
|
||||
written = writeall (fd, &dataset->resp, dataset->head.recsize);
|
||||
|
||||
if (written != dataset->head.recsize)
|
||||
all_written = false;
|
||||
}
|
||||
|
||||
/* Add the record to the database. But only if it has not been
|
||||
@ -332,7 +336,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
|
||||
}
|
||||
}
|
||||
|
||||
if (__builtin_expect (written != total, 0) && debug_level > 0)
|
||||
if (__builtin_expect (!all_written, 0) && debug_level > 0)
|
||||
{
|
||||
char buf[256];
|
||||
dbg_log (_("short write in %s: %s"), __FUNCTION__,
|
||||
|
Loading…
Reference in New Issue
Block a user