On 08/21/2013 04:47 PM, Michal Židek wrote:
On 08/21/2013 02:01 PM, Jakub Hrozek wrote:
On Wed, Aug 21, 2013 at 10:27:38AM +0200, Lukas Slebodnik wrote:
On (21/08/13 09:50), Pavel Březina wrote:
On 08/19/2013 09:56 PM, Michal Židek wrote:
+static void sss_mc_save_corrupted(struct sss_mc_ctx *mc_ctx)
+{
+ int err;
+ int fd = -1;
+ ssize_t written;
+ char *file = NULL;
+ TALLOC_CTX *tmp_ctx;
+
+ if (mc_ctx == NULL) {
+ DEBUG(SSSDBG_TRACE_FUNC,
+ ("Cannot store uninitialized cache. Nothing to
do.\n"));
+ return;
+ }
+
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory.\n"));
+ return;
+ }
+
+ file = talloc_asprintf(tmp_ctx, "%s_%s",
+ mc_ctx->file, "corrupted");
+ if (file == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory.\n"));
+ goto done;
+ }
+
+ /* We will always store only the last problematic cache state */
+ fd = creat(file, 0600);
+ if (fd == -1) {
+ err = errno;
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Failed to open file '%s' [%d]: %s\n",
+ file, err, strerror(err)));
+ goto done;
+ }
+
+ written = write(fd, mc_ctx->mmap_base, mc_ctx->mmap_size);
Shouldn't sss_atomic_write_s() be used?
sss_atomic_write_s is probably better. I though that the function
is only useful for non-blocking sockets, but after reading it's code I
see it is good to use it here too.
+ if (written != mc_ctx->mmap_size) {
+ if (written == -1) {
+ err = errno;
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("write() failed [%d]: %s\n", err, strerror(err)));
+ } else {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("write() returned %zd (expected (%zd))\n",
+ written, mc_ctx->mmap_size));
+ }
+ goto done;
+ }
I think the file should be unlinked in case of error.
Ok. I added unlink() call for the case if write returns -1. If the
file was only partially written (for whatever reason) it can still
hold some useful information, so I would prefer to keep it.
+
+ sss_log(SSS_LOG_NOTICE,
+ "Stored copy of corrupted mmap cache in file '%s\n'",
file);
+done:
+ if (fd != -1) {
+ close(fd);
+ }
+ talloc_free(tmp_ctx);
+}
I think that function sss_mc_save_corrupted will never be called with
patches
from thread "[PATCHES] mmap_cache: Skip records which doesn't have
same hash"
It is very likely that it is a dead code. I would prefer to ignore this
nitpicks, because patches have already been pushed.
LS
No, sorry, I would prefer to always fix and improve code. At the very
least, existing code acts as a reference when developing new code.
Since the original patch was already pushed, this one just adds the
requested changes.
Thanks
Michal
Since this was not yet pushed I did one more cosmetic change. I think
calling the close() before unlink() is more readable. If the fd != -1 we
already know that we want to close it, so the conditional check for
unlink() just makes noise before it. And this order is probably more
natural for most cases.
Michal
>From cae96ca65899af8b75e952ca5c66b9c08d18026f Mon Sep 17 00:00:00 2001
From: Michal Zidek <[email protected]>
Date: Wed, 21 Aug 2013 15:26:36 +0200
Subject: [PATCH] mmap_cache: Use sss_atomic_write_s instead of write.
Use sss_atomic_write_s() instead of write() in
sss_mc_save_corrupted(). Also unlink() the file if no data
were written.
It is better to use sss_atomic_write_s instead of write
---
src/responder/nss/nsssrv_mmap_cache.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c
index fced018..1f584a2 100644
--- a/src/responder/nss/nsssrv_mmap_cache.c
+++ b/src/responder/nss/nsssrv_mmap_cache.c
@@ -99,7 +99,7 @@ static void sss_mc_save_corrupted(struct sss_mc_ctx *mc_ctx)
{
int err;
int fd = -1;
- ssize_t written;
+ ssize_t written = -1;
char *file = NULL;
TALLOC_CTX *tmp_ctx;
@@ -132,7 +132,7 @@ static void sss_mc_save_corrupted(struct sss_mc_ctx *mc_ctx)
goto done;
}
- written = write(fd, mc_ctx->mmap_base, mc_ctx->mmap_size);
+ written = sss_atomic_write_s(fd, mc_ctx->mmap_base, mc_ctx->mmap_size);
if (written != mc_ctx->mmap_size) {
if (written == -1) {
err = errno;
@@ -151,6 +151,15 @@ static void sss_mc_save_corrupted(struct sss_mc_ctx *mc_ctx)
done:
if (fd != -1) {
close(fd);
+ if (written == -1) {
+ err = unlink(file);
+ if (err != 0) {
+ err = errno;
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Failed to remove file '%s': %s.\n", file,
+ strerror(err)));
+ }
+ }
}
talloc_free(tmp_ctx);
}
--
1.7.11.2
_______________________________________________
sssd-devel mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel