* bug#23371: emacs: paxctl usage on NetBSD @ 2016-04-25 12:09 Thomas Klausner 2016-04-26 0:09 ` Paul Eggert 0 siblings, 1 reply; 6+ messages in thread From: Thomas Klausner @ 2016-04-25 12:09 UTC (permalink / raw) To: 23371 Package: emacs Version: 25.1.50 emacs is using paxctl during the build, in two ways: "paxctl -zex file" and "paxctl -r file" However, the NetBSD version of paxctl has a different usage, e.g. "paxctl +a file" would turn off ASLR. For more details, see http://netbsd.gw.com/cgi-bin/man-cgi?paxctl++NetBSD-current When I replace 'paxctl -zex' with 'paxctl +a' in src/Makefile.in, the build succeeds. Thomas ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#23371: emacs: paxctl usage on NetBSD 2016-04-25 12:09 bug#23371: emacs: paxctl usage on NetBSD Thomas Klausner @ 2016-04-26 0:09 ` Paul Eggert 2016-04-27 15:54 ` Thomas Klausner 0 siblings, 1 reply; 6+ messages in thread From: Paul Eggert @ 2016-04-26 0:09 UTC (permalink / raw) To: Thomas Klausner; +Cc: 23371 [-- Attachment #1: Type: text/plain, Size: 418 bytes --] > When I replace 'paxctl -zex' with 'paxctl +a' in src/Makefile.in, the > build succeeds. Did you do something other than just that replacement? configure.ac says that paxctl is used only when the operating system is GNU/Linux, unless one manually configures by setting PAXCTL in the environment or using a PAXCTL=/some/path argument to 'configure'. Does the attached patch to the emacs-25 branch work for you? [-- Attachment #2: 0001-Port-dumping-to-NetBSD-with-PaX.patch --] [-- Type: application/x-patch, Size: 4456 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#23371: emacs: paxctl usage on NetBSD 2016-04-26 0:09 ` Paul Eggert @ 2016-04-27 15:54 ` Thomas Klausner 2016-04-27 19:38 ` Paul Eggert 0 siblings, 1 reply; 6+ messages in thread From: Thomas Klausner @ 2016-04-27 15:54 UTC (permalink / raw) To: Paul Eggert; +Cc: 23371 [-- Attachment #1: Type: text/plain, Size: 1445 bytes --] Hi Paul! Thanks for the fast reply! On Mon, Apr 25, 2016 at 05:09:56PM -0700, Paul Eggert wrote: > >When I replace 'paxctl -zex' with 'paxctl +a' in src/Makefile.in, the > >build succeeds. > > Did you do something other than just that replacement? No. > configure.ac says > that paxctl is used only when the operating system is GNU/Linux, unless one > manually configures by setting PAXCTL in the environment or using a > PAXCTL=/some/path argument to 'configure'. That's true, but src/Makefile.in ignores that: PAXCTL_if_present = $(or $(PAXCTL),: paxctl) > Does the attached patch to the emacs-25 branch work for you? I've modified it to apply to git head but it didn't work: Finding pointers to doc strings... Finding pointers to doc strings...done Loading /scratch/wip/emacs-current/work/emacs/lisp/site-init.el (source)... Dumping under the name emacs 18932704 of 33554432 static heap bytes used 91843 pure bytes used /usr/sbin/paxctl +a emacs mv -f emacs bootstrap-emacs /usr/sbin/paxctl +a bootstrap-emacs /usr/pkg/bin/gmake -C ../lisp compile-first EMACS="../src/bootstrap-emacs" gmake[3]: Entering directory '/scratch/wip/emacs-current/work/emacs/lisp' ELC emacs-lisp/macroexp.elc Memory fault (core dumped) Makefile:282: recipe for target 'emacs-lisp/macroexp.elc' failed My version is attached (I added some more paxctl's for the symlinks when the original version didn't work.) I hope I didn't break it. Thomas [-- Attachment #2: patch-configure.ac --] [-- Type: text/plain, Size: 2411 bytes --] $NetBSD$ Problem reported by Thomas Klausner (Bug#23371). * configure.ac (PAXCTL_dumped, PAXCTL_notdumped): New vars. Set them to setfattr and/or paxctl commands appropriate for GNU/Linux and/or NetBSD; the latter prefers paxctl +a. Search for paxctl only if setfattr is not found. * src/Makefile.in (PAXCTL_dumped, PAXCTL_notdumped): New vars, replacing PAXCTL_if_present and SETFATTR_if_present. All uses changed. --- configure.ac.orig 2016-04-22 16:23:52.000000000 +0000 +++ configure.ac @@ -1159,16 +1159,9 @@ AC_PATH_PROG(GZIP_PROG, gzip) test $with_compress_install != yes && test -n "$GZIP_PROG" && \ GZIP_PROG=" # $GZIP_PROG # (disabled by configure --without-compress-install)" +PAXCTL_dumped= +PAXCTL_notdumped= if test $opsys = gnu-linux; then - AC_PATH_PROG(PAXCTL, paxctl,, - [$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin]) - if test "X$PAXCTL" != X; then - AC_MSG_CHECKING([whether binaries have a PT_PAX_FLAGS header]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], - [if $PAXCTL -v conftest$EXEEXT >/dev/null 2>&1; then AC_MSG_RESULT(yes) - else AC_MSG_RESULT(no); PAXCTL=""; fi]) - fi - if test "${SETFATTR+set}" != set; then AC_CACHE_CHECK([for setfattr], [emacs_cv_prog_setfattr], @@ -1179,6 +1172,7 @@ if test $opsys = gnu-linux; then emacs_cv_prog_setfattr=no fi]) if test "$emacs_cv_prog_setfattr" = yes; then + PAXCTL_notdumped='$(SETFATTR) -n user.pax.flags -v er' SETFATTR=setfattr else SETFATTR= @@ -1187,6 +1181,31 @@ if test $opsys = gnu-linux; then AC_SUBST([SETFATTR]) fi fi +case $opsys,$PAXCTL_notdumped in + gnu-linux, | netbsd,) + AC_PATH_PROG([PAXCTL], [paxctl], [], + [$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin]) + if test -n "$PAXCTL"; then + if test "$opsys" = netbsd; then + PAXCTL_dumped='$(PAXCTL) +a' + else + AC_MSG_CHECKING([whether binaries have a PT_PAX_FLAGS header]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], + [if $PAXCTL -v conftest$EXEEXT >/dev/null 2>&1; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PAXCTL= + fi]) + if test -n "$PAXCTL"; then + PAXCTL_dumped='$(PAXCTL) -zex' + PAXCTL_notdumped='$(PAXCTL) -r' + fi + fi + fi;; +esac +AC_SUBST([PAXCTL_dumped]) +AC_SUBST([PAXCTL_notdumped]) ## Need makeinfo >= 4.7 (?) to build the manuals. if test "$MAKEINFO" != "no"; then [-- Attachment #3: patch-src_Makefile.in --] [-- Type: text/plain, Size: 2303 bytes --] $NetBSD$ Problem reported by Thomas Klausner (Bug#23371). * configure.ac (PAXCTL_dumped, PAXCTL_notdumped): New vars. Set them to setfattr and/or paxctl commands appropriate for GNU/Linux and/or NetBSD; the latter prefers paxctl +a. Search for paxctl only if setfattr is not found. * src/Makefile.in (PAXCTL_dumped, PAXCTL_notdumped): New vars, replacing PAXCTL_if_present and SETFATTR_if_present. All uses changed. --- src/Makefile.in.orig 2016-04-17 20:51:40.000000000 +0000 +++ src/Makefile.in @@ -114,8 +114,9 @@ TEMACS_LDFLAGS = $(LD_SWITCH_SYSTEM) $(L ## around this, newer ones setfattr. See Bug#11398 and Bug#16343. PAXCTL = @PAXCTL@ SETFATTR = @SETFATTR@ -PAXCTL_if_present = $(or $(PAXCTL),: paxctl) -SETFATTR_if_present = $(or $(SETFATTR),: setfattr) +## Commands to set PaX flags on dumped and not-dumped instances of Emacs. +PAXCTL_dumped = @PAXCTL_dumped@ +PAXCTL_notdumped = @PAXCTL_notdumped@ ## Some systems define this to request special libraries. LIBS_SYSTEM=@LIBS_SYSTEM@ @@ -542,8 +543,13 @@ ifeq ($(CANNOT_DUMP),yes) ln -f temacs$(EXEEXT) $@ else LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup dump - $(PAXCTL_if_present) -zex $@ +ifneq ($(PAXCTL_dumped),) + $(PAXCTL_dumped) $@ +endif ln -f $@ bootstrap-emacs$(EXEEXT) +ifneq ($(PAXCTL_dumped),) + $(PAXCTL_dumped) bootstrap-emacs$(EXEEXT) +endif endif ## We run make-docfile twice because the command line may get too long @@ -606,8 +612,9 @@ temacs$(EXEEXT): $(LIBXMENU) $(ALLOBJS) -o temacs $(ALLOBJS) $(LIBEGNU_ARCHIVE) $(W32_RES_LINK) $(LIBES) $(MKDIR_P) $(etc) ifneq ($(CANNOT_DUMP),yes) - $(PAXCTL_if_present) -r $@ - $(SETFATTR_if_present) -n user.pax.flags -v er $@ + ifneq ($(PAXCTL_notdumped),) + $(PAXCTL_notdumped) $@ + endif endif ## The following oldxmenu-related rules are only (possibly) used if @@ -748,8 +755,13 @@ ifeq ($(CANNOT_DUMP),yes) ln -f temacs$(EXEEXT) $@ else $(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap - $(PAXCTL_if_present) -zex emacs$(EXEEXT) +ifneq ($(PAXCTL_dumped),) + $(PAXCTL_dumped) emacs$(EXEEXT) +endif mv -f emacs$(EXEEXT) $@ +ifneq ($(PAXCTL_dumped),) + $(PAXCTL_dumped) $@ +endif endif @: Compile some files earlier to speed up further compilation. $(MAKE) -C ../lisp compile-first EMACS="$(bootstrap_exe)" ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#23371: emacs: paxctl usage on NetBSD 2016-04-27 15:54 ` Thomas Klausner @ 2016-04-27 19:38 ` Paul Eggert 2016-04-27 22:50 ` Thomas Klausner 0 siblings, 1 reply; 6+ messages in thread From: Paul Eggert @ 2016-04-27 19:38 UTC (permalink / raw) To: Thomas Klausner; +Cc: 23371 On 04/27/2016 08:54 AM, Thomas Klausner wrote: >> configure.ac says >> that paxctl is used only when the operating system is GNU/Linux, unless one >> manually configures by setting PAXCTL in the environment or using a >> PAXCTL=/some/path argument to 'configure'. > That's true, but src/Makefile.in ignores that: > PAXCTL_if_present = $(or $(PAXCTL),: paxctl) I guess I'm still not following. On non-GNU/Linux hosts, $(PAXCTL) should be empty because paxctl is not searched for, so PAXCTL_if_present should be ': paxctl', i.e., a no-op shell command. And yet you reported that your build used 'paxctl -zex' and 'paxctl -r'. Perhaps your build was actually using the no-ops ': paxctl -zex' and ': paxctl -r' and you didn't notice the colons? That is, perhaps you replaced ': paxctl -zex' (with a prefix colon) with 'paxctl +a' (without the colon)? > > My version is attached (I added some more paxctl's for the symlinks > when the original version didn't work.) I hope I didn't break it. Did it work with your version? If so, does 'ln' and/or 'mv' remove the mark placed on an executable by 'paxctl +a'? and if that happens, how does 'make install' avoid removing the mark in the installed Emacs? If not, then I'm afraid I'm lost. Also, I noticed that you removed the indenting on some of the 'ifeq' lines in src/Makefile.in; why was that necessary? ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#23371: emacs: paxctl usage on NetBSD 2016-04-27 19:38 ` Paul Eggert @ 2016-04-27 22:50 ` Thomas Klausner 2016-04-27 23:08 ` Paul Eggert 0 siblings, 1 reply; 6+ messages in thread From: Thomas Klausner @ 2016-04-27 22:50 UTC (permalink / raw) To: Paul Eggert; +Cc: 23371 [-- Attachment #1: Type: text/plain, Size: 3590 bytes --] On Wed, Apr 27, 2016 at 12:38:53PM -0700, Paul Eggert wrote: > On 04/27/2016 08:54 AM, Thomas Klausner wrote: > >>configure.ac says > >>that paxctl is used only when the operating system is GNU/Linux, unless one > >>manually configures by setting PAXCTL in the environment or using a > >>PAXCTL=/some/path argument to 'configure'. > >That's true, but src/Makefile.in ignores that: > >PAXCTL_if_present = $(or $(PAXCTL),: paxctl) > > I guess I'm still not following. On non-GNU/Linux hosts, $(PAXCTL) should be > empty because paxctl is not searched for, so PAXCTL_if_present should be ': > paxctl', i.e., a no-op shell command. And yet you reported that your build > used 'paxctl -zex' and 'paxctl -r'. Perhaps your build was actually using > the no-ops ': paxctl -zex' and ': paxctl -r' and you didn't notice the > colons? That is, perhaps you replaced ': paxctl -zex' (with a prefix colon) > with 'paxctl +a' (without the colon)? You're right, I didn't do exactly what I described. The build system as-is does not use paxctl on NetBSD, so this breaks when ASLR is enabled. I run the following sed expressions on src/Makefile.in: 's,$$(PAXCTL_if_present) -zex,/usr/sbin/paxctl +a,g' 's,$$(PAXCTL_if_present) -r,/usr/sbin/paxctl +a,g' > >My version is attached (I added some more paxctl's for the symlinks > >when the original version didn't work.) I hope I didn't break it. > > Did it work with your version? No, I just posted it so you can see what I did. > If so, does 'ln' and/or 'mv' remove the mark placed on an executable by > 'paxctl +a'? and if that happens, how does 'make install' avoid removing the > mark in the installed Emacs? > > If not, then I'm afraid I'm lost. All of cp, mv, and ln keep the paxctl settings: # paxctl a PaX flags: a: ASLR, explicit disable # cp a b # paxctl b PaX flags: a: ASLR, explicit disable # ln b c # paxctl c PaX flags: a: ASLR, explicit disable # mv c d # paxctl d PaX flags: a: ASLR, explicit disable I wasn't sure of that, so I added the extra ones, since it wasn't working. It's not necessary, so I removed it again. > Also, I noticed that you removed the indenting on some of the 'ifeq' lines > in src/Makefile.in; why was that necessary? Because the patch didn't apply cleanly, I had to manually apply it, and I didn't indent it correctly, sorry. So perhaps there is a different problem and paxctl is not properly detected or applied even with your patch. Let's look more closely: PAXCTL_dumped value: work/emacs/config.log:PAXCTL_dumped='$(PAXCTL) +a' work/emacs/lib/Makefile:PAXCTL_dumped = $(PAXCTL) +a work/emacs/src/Makefile:PAXCTL_dumped = $(PAXCTL) +a PAXCTL itself: work/emacs/config.log:PAXCTL='/usr/sbin/paxctl' work/emacs/lib/Makefile:PAXCTL = /usr/sbin/paxctl work/emacs/src/Makefile:PAXCTL = /usr/sbin/paxctl But PAXCTL_notdumped is empty. work/emacs/config.status:S["PAXCTL_notdumped"]="" work/emacs/lib/Makefile:PAXCTL_notdumped = work/emacs/src/Makefile:PAXCTL_notdumped = On Linux this uses paxctl -r, which, according to http://man.he.net/man1/paxctl is: -r do not randomize memory regions (NORANDMMAP) While on NetBSD, +a does: a Explicitly disable PaX ASLR (Address Space Layout Randomization) for program. So perhaps notdumped also needs to call paxctl +a, like my sed expressions do. (later) Yes, that's it. I've defined PAXCTL_notdumped to the same value as PAXCTL_dumped and emacs builds fine now -- basically, one additional line to configure.ac in the netbsd case. I'll attach my patches again, just to make it absolutely clear. Thanks, Thomas [-- Attachment #2: patch-configure.ac --] [-- Type: text/plain, Size: 2445 bytes --] $NetBSD$ Problem reported by Thomas Klausner (Bug#23371). * configure.ac (PAXCTL_dumped, PAXCTL_notdumped): New vars. Set them to setfattr and/or paxctl commands appropriate for GNU/Linux and/or NetBSD; the latter prefers paxctl +a. Search for paxctl only if setfattr is not found. * src/Makefile.in (PAXCTL_dumped, PAXCTL_notdumped): New vars, replacing PAXCTL_if_present and SETFATTR_if_present. All uses changed. --- configure.ac.orig 2016-04-22 16:23:52.000000000 +0000 +++ configure.ac @@ -1159,16 +1159,9 @@ AC_PATH_PROG(GZIP_PROG, gzip) test $with_compress_install != yes && test -n "$GZIP_PROG" && \ GZIP_PROG=" # $GZIP_PROG # (disabled by configure --without-compress-install)" +PAXCTL_dumped= +PAXCTL_notdumped= if test $opsys = gnu-linux; then - AC_PATH_PROG(PAXCTL, paxctl,, - [$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin]) - if test "X$PAXCTL" != X; then - AC_MSG_CHECKING([whether binaries have a PT_PAX_FLAGS header]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], - [if $PAXCTL -v conftest$EXEEXT >/dev/null 2>&1; then AC_MSG_RESULT(yes) - else AC_MSG_RESULT(no); PAXCTL=""; fi]) - fi - if test "${SETFATTR+set}" != set; then AC_CACHE_CHECK([for setfattr], [emacs_cv_prog_setfattr], @@ -1179,6 +1172,7 @@ if test $opsys = gnu-linux; then emacs_cv_prog_setfattr=no fi]) if test "$emacs_cv_prog_setfattr" = yes; then + PAXCTL_notdumped='$(SETFATTR) -n user.pax.flags -v er' SETFATTR=setfattr else SETFATTR= @@ -1187,6 +1181,32 @@ if test $opsys = gnu-linux; then AC_SUBST([SETFATTR]) fi fi +case $opsys,$PAXCTL_notdumped in + gnu-linux, | netbsd,) + AC_PATH_PROG([PAXCTL], [paxctl], [], + [$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin]) + if test -n "$PAXCTL"; then + if test "$opsys" = netbsd; then + PAXCTL_dumped='$(PAXCTL) +a' + PAXCTL_notdumped='$(PAXCTL) +a' + else + AC_MSG_CHECKING([whether binaries have a PT_PAX_FLAGS header]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], + [if $PAXCTL -v conftest$EXEEXT >/dev/null 2>&1; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PAXCTL= + fi]) + if test -n "$PAXCTL"; then + PAXCTL_dumped='$(PAXCTL) -zex' + PAXCTL_notdumped='$(PAXCTL) -r' + fi + fi + fi;; +esac +AC_SUBST([PAXCTL_dumped]) +AC_SUBST([PAXCTL_notdumped]) ## Need makeinfo >= 4.7 (?) to build the manuals. if test "$MAKEINFO" != "no"; then [-- Attachment #3: patch-src_Makefile.in --] [-- Type: text/plain, Size: 2169 bytes --] $NetBSD$ Problem reported by Thomas Klausner (Bug#23371). * configure.ac (PAXCTL_dumped, PAXCTL_notdumped): New vars. Set them to setfattr and/or paxctl commands appropriate for GNU/Linux and/or NetBSD; the latter prefers paxctl +a. Search for paxctl only if setfattr is not found. * src/Makefile.in (PAXCTL_dumped, PAXCTL_notdumped): New vars, replacing PAXCTL_if_present and SETFATTR_if_present. All uses changed. --- src/Makefile.in.orig 2016-04-17 20:51:40.000000000 +0000 +++ src/Makefile.in @@ -114,8 +114,9 @@ TEMACS_LDFLAGS = $(LD_SWITCH_SYSTEM) $(L ## around this, newer ones setfattr. See Bug#11398 and Bug#16343. PAXCTL = @PAXCTL@ SETFATTR = @SETFATTR@ -PAXCTL_if_present = $(or $(PAXCTL),: paxctl) -SETFATTR_if_present = $(or $(SETFATTR),: setfattr) +## Commands to set PaX flags on dumped and not-dumped instances of Emacs. +PAXCTL_dumped = @PAXCTL_dumped@ +PAXCTL_notdumped = @PAXCTL_notdumped@ ## Some systems define this to request special libraries. LIBS_SYSTEM=@LIBS_SYSTEM@ @@ -542,8 +543,10 @@ ifeq ($(CANNOT_DUMP),yes) ln -f temacs$(EXEEXT) $@ else LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup dump - $(PAXCTL_if_present) -zex $@ +ifneq ($(PAXCTL_dumped),) + $(PAXCTL_dumped) $@ +endif ln -f $@ bootstrap-emacs$(EXEEXT) endif ## We run make-docfile twice because the command line may get too long @@ -606,8 +612,9 @@ temacs$(EXEEXT): $(LIBXMENU) $(ALLOBJS) -o temacs $(ALLOBJS) $(LIBEGNU_ARCHIVE) $(W32_RES_LINK) $(LIBES) $(MKDIR_P) $(etc) ifneq ($(CANNOT_DUMP),yes) - $(PAXCTL_if_present) -r $@ - $(SETFATTR_if_present) -n user.pax.flags -v er $@ + ifneq ($(PAXCTL_notdumped),) + $(PAXCTL_notdumped) $@ + endif endif ## The following oldxmenu-related rules are only (possibly) used if @@ -748,8 +755,10 @@ ifeq ($(CANNOT_DUMP),yes) ln -f temacs$(EXEEXT) $@ else $(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap - $(PAXCTL_if_present) -zex emacs$(EXEEXT) +ifneq ($(PAXCTL_dumped),) + $(PAXCTL_dumped) emacs$(EXEEXT) +endif mv -f emacs$(EXEEXT) $@ endif @: Compile some files earlier to speed up further compilation. $(MAKE) -C ../lisp compile-first EMACS="$(bootstrap_exe)" ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#23371: emacs: paxctl usage on NetBSD 2016-04-27 22:50 ` Thomas Klausner @ 2016-04-27 23:08 ` Paul Eggert 0 siblings, 0 replies; 6+ messages in thread From: Paul Eggert @ 2016-04-27 23:08 UTC (permalink / raw) To: Thomas Klausner; +Cc: 23371-done On 04/27/2016 03:50 PM, Thomas Klausner wrote: > Yes, that's it. I've defined PAXCTL_notdumped to the same value as > PAXCTL_dumped and emacs builds fine now -- basically, one additional > line to configure.ac in the netbsd case. Thanks, I installed a patch along those lines into the emacs-25 branch. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-04-27 23:08 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-04-25 12:09 bug#23371: emacs: paxctl usage on NetBSD Thomas Klausner 2016-04-26 0:09 ` Paul Eggert 2016-04-27 15:54 ` Thomas Klausner 2016-04-27 19:38 ` Paul Eggert 2016-04-27 22:50 ` Thomas Klausner 2016-04-27 23:08 ` Paul Eggert
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).