]> err.no Git - varnish/commitdiff
Better and more paranoid SHMEM creation logic
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 14 Jul 2006 11:44:28 +0000 (11:44 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 14 Jul 2006 11:44:28 +0000 (11:44 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@471 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/shmlog.c

index cfe84d626b64517a384ed615e5cd6a253628b8f4..6db6331770031b96e1599c907aa01da9343f8bae 100644 (file)
@@ -141,19 +141,29 @@ void
 VSL_MgtInit(const char *fn, unsigned size)
 {
        struct shmloghead slh;
-       int i;
-
-       heritage.vsl_fd = open(fn, O_RDWR | O_CREAT, 0644);
-       if (heritage.vsl_fd < 0) {
-               fprintf(stderr, "Could not open %s: %s\n",
-                   fn, strerror(errno));
-               exit (1);
-       }
-       i = read(heritage.vsl_fd, &slh, sizeof slh);
-       if (i != sizeof slh || slh.magic != SHMLOGHEAD_MAGIC) {
+       int i = 0;
+
+       heritage.vsl_fd = open(fn, O_RDWR, 0644);
+       if (heritage.vsl_fd >= 0)
+               i = read(heritage.vsl_fd, &slh, sizeof slh);
+       if (heritage.vsl_fd < 0 || i != sizeof slh ||
+           slh.magic != SHMLOGHEAD_MAGIC ||
+           slh.hdrsize != sizeof slh) {
                /* XXX more checks */
 
+               if (heritage.vsl_fd >= 0);
+                       close(heritage.vsl_fd);
+               unlink(fn);
+               heritage.vsl_fd = open(fn, O_RDWR | O_CREAT, 0644);
+               if (heritage.vsl_fd < 0) {
+                       fprintf(stderr, "Could not open %s: %s\n",
+                           fn, strerror(errno));
+                       exit (1);
+               }
+               memset(&slh, 0, sizeof slh);
+
                slh.magic = SHMLOGHEAD_MAGIC;
+               slh.hdrsize = sizeof slh;
                slh.size = size;
                slh.ptr = 0;
                slh.start = sizeof slh;