On 2017/12/04 17:36, Sebastien Marie wrote:
> On Mon, Dec 04, 2017 at 11:41:10AM +0100, Sebastien Marie wrote:
> > Hi,
> > 
> > ISSUE: "Regression: rrdtool creates folders/files with arbitrary 
> > permissions"
> >     https://github.com/oetiker/rrdtool-1.x/issues/794
> > 
> > FIX: "Remove all occurances of umask ... this is NOT thread safe! Fix for 
> > #794"
> >     
> > https://github.com/oetiker/rrdtool-1.x/commit/f1edd121add94fe69ac22d991748d289b5eb76ae
> > 
> > The following diff is the fix applied on 1.7.0.
> > 
> 
> updated diff. It looks like my local repository wasn't up-to-date.
> 
> Sorry about that.

Thanks - there are some slight problems with the upstream commit,

> -- 
> Sebastien Marie
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/net/rrdtool/Makefile,v
> retrieving revision 1.107
> diff -u -p -r1.107 Makefile
> --- Makefile  1 Dec 2017 10:36:51 -0000       1.107
> +++ Makefile  4 Dec 2017 16:34:45 -0000
> @@ -12,7 +12,7 @@ PKGNAME-main=       ${DISTNAME}
>  PKGNAME-update=      rrdupdate-${VERSION}
>  PKGNAME-python= py-rrd-${VERSION}
>  PKGNAME-ruby=        ruby${MODRUBY_BINREV}-rrd-${VERSION}
> -REVISION-main=       2
> +REVISION-main=       3
>  REVISION-update= 0

-update uses this code too. Not sure if it's built directly into the bindings
as well but I would just bump everything, it's cheap.

>  
>  SHARED_LIBS +=       rrd                  5.2      # 9.0
> Index: patches/patch-doc_rrdcreate_pod
> ===================================================================
> RCS file: patches/patch-doc_rrdcreate_pod
> diff -N patches/patch-doc_rrdcreate_pod
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-doc_rrdcreate_pod   4 Dec 2017 16:34:45 -0000
> @@ -0,0 +1,19 @@
> +$OpenBSD$
> +Fix for https://github.com/oetiker/rrdtool-1.x/issues/794
> +https://github.com/oetiker/rrdtool-1.x/commit/f1edd121add94fe69ac22d991748d289b5eb76ae
> +Index: doc/rrdcreate.pod
> +--- doc/rrdcreate.pod.orig
> ++++ doc/rrdcreate.pod
> +@@ -743,6 +743,12 @@ divides each PDP of the AccumDuration by the correspon
> + TotalRequests and stores the average request duration. The remainder of the
> + RPN expression handles the divide by zero case.
> + 
> ++=head1 SECURITY
> ++
> ++Note that new rrd files will have the permission 0622 regarless of your
> ++umask setting. If a file with the same name previously exists, its
> ++permission settings will be copied to the new file.

644 not 622. And if they're touching that, they can fix spelling of
"regardless" as well :)

> ++
> + =head1 AUTHORS
> + 
> + Tobias Oetiker E<lt>[email protected]<gt>, Peter Stamfest 
> E<lt>[email protected]<gt>
> Index: patches/patch-src_rrd_create_c
> ===================================================================
> RCS file: patches/patch-src_rrd_create_c
> diff -N patches/patch-src_rrd_create_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-src_rrd_create_c    4 Dec 2017 16:34:45 -0000
> @@ -0,0 +1,56 @@
> +$OpenBSD$
> +Fix for https://github.com/oetiker/rrdtool-1.x/issues/794
> +https://github.com/oetiker/rrdtool-1.x/commit/f1edd121add94fe69ac22d991748d289b5eb76ae
> +Index: src/rrd_create.c
> +--- src/rrd_create.c.orig
> ++++ src/rrd_create.c
> +@@ -4,6 +4,7 @@
> +  * rrd_create.c  creates new rrds
> +  
> *****************************************************************************/
> + 
> ++#include "mutex.h"

Remnant of an earlier attempt at fixing?

> + #include <stdlib.h>
> + #include <time.h>
> + #include <locale.h>
> +@@ -1313,10 +1314,10 @@ done:
> +     return rc;
> + }
> + 
> ++
> + int write_rrd(const char *outfilename, rrd_t *out) {
> +     int rc = -1;
> +     char *tmpfilename = NULL;
> +-    mode_t saved_umask;
> + 
> +     /* write out the new file */
> + #ifdef HAVE_LIBRADOS
> +@@ -1341,10 +1342,10 @@ int write_rrd(const char *outfilename, rrd_t *out) {
> +     strcpy(tmpfilename, outfilename);
> +     strcat(tmpfilename, "XXXXXX");
> +     
> +-    /* fix CWE-377 */
> +-    saved_umask = umask(S_IRUSR|S_IWUSR);
> ++    /* this is 0600 according to the manual page */
> +     int tmpfd = mkstemp(tmpfilename);
> +-    umask(saved_umask);
> ++
> ++
> +     if (tmpfd < 0) {
> +         rrd_set_error("Cannot create temporary file");
> +         goto done;
> +@@ -1377,13 +1378,8 @@ int write_rrd(const char *outfilename, rrd_t *out) {
> +                 stat_buf.st_mode = _S_IREAD | _S_IWRITE;  // have to test 
> it is 
> + #else
> +             /* an error occurred (file not found, maybe?). Anyway:
> +-               set the mode to 0666 using current umask */
> +-            stat_buf.st_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | 
> S_IROTH | S_IWOTH;
> +-            
> +-            mode_t mask = umask(0);
> +-            umask(mask);
> +-
> +-            stat_buf.st_mode &= ~mask;
> ++               set the mode to 0644 using current umask */
> ++            stat_buf.st_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

The "using current umask" comment here is wrong.

> + #endif                
> +         }
> +         if (chmod(tmpfilename, stat_buf.st_mode) != 0) {

I propose just doing this for now. What do you think?

Index: Makefile
===================================================================
RCS file: /cvs/ports/net/rrdtool/Makefile,v
retrieving revision 1.107
diff -u -p -r1.107 Makefile
--- Makefile    1 Dec 2017 10:36:51 -0000       1.107
+++ Makefile    5 Dec 2017 10:50:58 -0000
@@ -12,8 +12,7 @@ PKGNAME-main= ${DISTNAME}
 PKGNAME-update=        rrdupdate-${VERSION}
 PKGNAME-python= py-rrd-${VERSION}
 PKGNAME-ruby=  ruby${MODRUBY_BINREV}-rrd-${VERSION}
-REVISION-main= 2
-REVISION-update= 0
+REVISION=      4
 
 SHARED_LIBS += rrd                  5.2      # 9.0
 
Index: patches/patch-src_rrd_create_c
===================================================================
RCS file: patches/patch-src_rrd_create_c
diff -N patches/patch-src_rrd_create_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_rrd_create_c      5 Dec 2017 10:50:58 -0000
@@ -0,0 +1,50 @@
+$OpenBSD$
+
+Based on:
+
+From f1edd121add94fe69ac22d991748d289b5eb76ae Mon Sep 17 00:00:00 2001
+From: Tobias Oetiker <[email protected]>
+Date: Sun, 11 Jun 2017 17:19:05 +0200
+Subject: [PATCH] Remove all occurances of umask ... this is NOT thread safe!
+ Fix for #794.
+
+Index: src/rrd_create.c
+--- src/rrd_create.c.orig
++++ src/rrd_create.c
+@@ -1316,7 +1316,6 @@ done:
+ int write_rrd(const char *outfilename, rrd_t *out) {
+     int rc = -1;
+     char *tmpfilename = NULL;
+-    mode_t saved_umask;
+ 
+     /* write out the new file */
+ #ifdef HAVE_LIBRADOS
+@@ -1341,10 +1340,9 @@ int write_rrd(const char *outfilename, rrd_t *out) {
+       strcpy(tmpfilename, outfilename);
+       strcat(tmpfilename, "XXXXXX");
+       
+-      /* fix CWE-377 */
+-      saved_umask = umask(S_IRUSR|S_IWUSR);
++      /* this is 0600 according to the manual page */
+       int tmpfd = mkstemp(tmpfilename);
+-      umask(saved_umask);
++
+       if (tmpfd < 0) {
+           rrd_set_error("Cannot create temporary file");
+           goto done;
+@@ -1377,13 +1375,8 @@ int write_rrd(const char *outfilename, rrd_t *out) {
+                 stat_buf.st_mode = _S_IREAD | _S_IWRITE;  // have to test it 
is 
+ #else
+               /* an error occurred (file not found, maybe?). Anyway:
+-                 set the mode to 0666 using current umask */
+-              stat_buf.st_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | 
S_IROTH | S_IWOTH;
+-              
+-              mode_t mask = umask(0);
+-              umask(mask);
+-
+-              stat_buf.st_mode &= ~mask;
++                 set the mode to 0644 */
++              stat_buf.st_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ #endif                
+           }
+           if (chmod(tmpfilename, stat_buf.st_mode) != 0) {

Reply via email to