From: Kei Kebreau <kei@openmailbox.org>
To: Leo Famulari <leo@famulari.name>
Cc: guix-devel@gnu.org
Subject: Re: Chicken security bugs [was Re: [peter@more-magic.net: Irregex packages should be updated to 0.9.6]]
Date: Thu, 22 Dec 2016 14:20:37 -0500 [thread overview]
Message-ID: <87lgv7zs6y.fsf@openmailbox.org> (raw)
In-Reply-To: <20161216193659.GA26067@jasmine> (Leo Famulari's message of "Fri, 16 Dec 2016 14:36:59 -0500")
[-- Attachment #1.1: Type: text/plain, Size: 572 bytes --]
Leo Famulari <leo@famulari.name> writes:
> On Fri, Dec 16, 2016 at 02:33:19PM -0500, Leo Famulari wrote:
>> We fixed this bug in our guile-irregex package in commit fb73f07a0fe,
>> but our chez-irregex and chicken packages are still vulnerable.
>
> Also note that (I believe) our chicken package is vulnerable to
> CVE-2016-{6830,6831}:
>
> http://lists.nongnu.org/archive/html/chicken-announce/2016-08/msg00002.html
The attached patch is currently being tested on my computer, but I
suspect it will work.
See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=834845.
[-- Attachment #1.2: 0001-gnu-chicken-Fix-CVE-2016-6830-6831.patch --]
[-- Type: text/plain, Size: 19872 bytes --]
From 3423ef38ecab794f9601aa8ac63c6974d9db62d4 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kei@openmailbox.org>
Date: Thu, 22 Dec 2016 14:16:55 -0500
Subject: [PATCH] gnu: chicken: Fix CVE-2016-{6830,6831}.
* gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch: New file.
* gnu/local.mk (dist_patch_DATA): Use it.
* gnu/packages/scheme.scm (chicken)[source]: Use it.
---
gnu/local.mk | 1 +
.../chicken-CVE-2016-6830+CVE-2016-6831.patch | 426 +++++++++++++++++++++
gnu/packages/scheme.scm | 4 +-
3 files changed, 430 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index ee8f1e591..81a216a39 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -497,6 +497,7 @@ dist_patch_DATA = \
%D%/packages/patches/calibre-drop-unrar.patch \
%D%/packages/patches/calibre-no-updates-dialog.patch \
%D%/packages/patches/cdparanoia-fpic.patch \
+ %D%/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch \
%D%/packages/patches/chmlib-inttypes.patch \
%D%/packages/patches/clang-libc-search-path.patch \
%D%/packages/patches/clang-3.8-libc-search-path.patch \
diff --git a/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch b/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch
new file mode 100644
index 000000000..45d5442e0
--- /dev/null
+++ b/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch
@@ -0,0 +1,426 @@
+The following patch was adapted for CHICKEN Scheme
+by Kei Kebreau <kei@openmailbox.org> based on:
+
+https://lists.nongnu.org/archive/html/chicken-hackers/2016-07/txtSWHYeFeG0R.txt
+
+diff -r -u a/NEWS b/NEWS
+--- a/NEWS 2016-12-22 14:06:40.016494788 -0500
++++ b/NEWS 2016-12-22 14:06:49.216803605 -0500
+@@ -27,6 +27,12 @@
+ - The signal handling code can no longer trigger "stack overflow" or
+ "recursion too deep or circular data encountered" errors (#1283).
+
++- Security fixes
++ - Fix buffer overrun due to excessively long argument or
++ environment lists in process-execute and process-spawn (#1308).
++ This also removes unnecessary limitations on the length of
++ these lists (thanks to Vasilij Schneidermann).
++
+ - Compiler:
+ - Specializations on implicit "or" types like "number" or "boolean" now
+ work, removing the requirement for the inferred types to match
+diff -r -u a/posix-common.scm b/posix-common.scm
+--- a/posix-common.scm 2016-12-22 14:06:40.024495057 -0500
++++ b/posix-common.scm 2016-12-22 14:06:55.961030020 -0500
+@@ -25,7 +25,8 @@
+
+
+ (declare
+- (hide ##sys#stat posix-error check-time-vector ##sys#find-files)
++ (hide ##sys#stat posix-error check-time-vector ##sys#find-files
++ list->c-string-buffer free-c-string-buffer call-with-exec-args)
+ (foreign-declare #<<EOF
+
+ #include <signal.h>
+@@ -679,3 +680,65 @@
+ (if (fx= epid -1)
+ (posix-error #:process-error 'process-wait "waiting for child process failed" pid)
+ (values epid enorm ecode) ) ) ) ) ) )
++
++;; This can construct argv or envp for process-execute or process-run
++(define list->c-string-buffer
++ (let* ((c-string->allocated-pointer
++ (foreign-lambda* c-pointer ((scheme-object o))
++ "char *ptr = malloc(C_header_size(o)); \n"
++ "if (ptr != NULL) {\n"
++ " C_memcpy(ptr, C_data_pointer(o), C_header_size(o)); \n"
++ "}\n"
++ "C_return(ptr);")) )
++ (lambda (string-list convert loc)
++ (##sys#check-list string-list loc)
++
++ (let* ((string-count (##sys#length string-list))
++ ;; NUL-terminated, so we must add one
++ (buffer (make-pointer-vector (add1 string-count) #f)))
++
++ (handle-exceptions exn
++ ;; Free to avoid memory leak, then reraise
++ (begin (free-c-string-buffer buffer) (signal exn))
++
++ (do ((sl string-list (cdr sl))
++ (i 0 (fx+ i 1)) )
++ ((or (null? sl) (fx= i string-count))) ; Should coincide
++
++ (##sys#check-string (car sl) loc)
++ ;; This avoids embedded NULs and appends a NUL, so "cs" is
++ ;; safe to copy and use as-is in the pointer-vector.
++ (let* ((cs (##sys#make-c-string (convert (car sl)) loc))
++ (csp (c-string->allocated-pointer cs)))
++ (unless csp (error loc "Out of memory"))
++ (pointer-vector-set! buffer i csp)) )
++
++ buffer) ) ) ) )
++
++(define (free-c-string-buffer buffer-array)
++ (let ((size (pointer-vector-length buffer-array)))
++ (do ((i 0 (fx+ i 1)))
++ ((fx= i size))
++ (and-let* ((s (pointer-vector-ref buffer-array i)))
++ (free s)))))
++
++(define call-with-exec-args
++ (let ((pathname-strip-directory pathname-strip-directory)
++ (nop (lambda (x) x)))
++ (lambda (loc filename argconv arglist envlist proc)
++ (let* ((stripped-filename (pathname-strip-directory filename))
++ (args (cons stripped-filename arglist)) ; Add argv[0]
++ (argbuf (list->c-string-buffer args argconv loc))
++ (envbuf #f))
++
++ (handle-exceptions exn
++ ;; Free to avoid memory leak, then reraise
++ (begin (free-c-string-buffer argbuf)
++ (when envbuf (free-c-string-buffer envbuf))
++ (signal exn))
++
++ ;; Envlist is never converted, so we always use nop here
++ (when envlist
++ (set! envbuf (list->c-string-buffer envlist nop loc)))
++
++ (proc (##sys#make-c-string filename loc) argbuf envbuf) )))))
+diff -r -u a/posixunix.scm b/posixunix.scm
+--- a/posixunix.scm 2016-12-22 14:06:39.976493446 -0500
++++ b/posixunix.scm 2016-12-22 14:06:55.961030020 -0500
+@@ -27,7 +27,7 @@
+
+ (declare
+ (unit posix)
+- (uses scheduler irregex extras files ports)
++ (uses scheduler irregex extras files ports lolevel)
+ (disable-interrupts)
+ (hide group-member _get-groups _ensure-groups posix-error ##sys#terminal-check)
+ (not inline ##sys#interrupt-hook ##sys#user-interrupt-hook))
+@@ -88,10 +88,6 @@
+ # define O_TEXT 0
+ #endif
+
+-#ifndef ARG_MAX
+-# define ARG_MAX 256
+-#endif
+-
+ #ifndef MAP_FILE
+ # define MAP_FILE 0
+ #endif
+@@ -110,16 +106,10 @@
+ # define C_getenventry(i) (environ[ i ])
+ #endif
+
+-#ifndef ENV_MAX
+-# define ENV_MAX 1024
+-#endif
+-
+ #ifndef FILENAME_MAX
+ # define FILENAME_MAX 1024
+ #endif
+
+-static C_TLS char *C_exec_args[ ARG_MAX ];
+-static C_TLS char *C_exec_env[ ENV_MAX ];
+ static C_TLS struct utsname C_utsname;
+ static C_TLS struct flock C_flock;
+ static C_TLS DIR *temphandle;
+@@ -199,29 +189,8 @@
+
+ #define C_lstat(fn) C_fix(lstat((char *)C_data_pointer(fn), &C_statbuf))
+
+-static void C_fcall C_set_arg_string(char **where, int i, char *a, int len) {
+- char *ptr;
+- if(a != NULL) {
+- ptr = (char *)C_malloc(len + 1);
+- C_memcpy(ptr, a, len);
+- ptr[ len ] = '\0';
+- /* Can't barf() here, so the NUL byte check happens in Scheme */
+- }
+- else ptr = NULL;
+- where[ i ] = ptr;
+-}
+-
+-static void C_fcall C_free_arg_string(char **where) {
+- while((*where) != NULL) C_free(*(where++));
+-}
+-
+-#define C_set_exec_arg(i, a, len) C_set_arg_string(C_exec_args, i, a, len)
+-#define C_free_exec_args() C_free_arg_string(C_exec_args)
+-#define C_set_exec_env(i, a, len) C_set_arg_string(C_exec_env, i, a, len)
+-#define C_free_exec_env() C_free_arg_string(C_exec_env)
+-
+-#define C_execvp(f) C_fix(execvp(C_data_pointer(f), C_exec_args))
+-#define C_execve(f) C_fix(execve(C_data_pointer(f), C_exec_args, C_exec_env))
++#define C_u_i_execvp(f,a) C_fix(execvp(C_data_pointer(f), (char *const *)C_c_pointer_vector_or_null(a)))
++#define C_u_i_execve(f,a,e) C_fix(execve(C_data_pointer(f), (char *const *)C_c_pointer_vector_or_null(a), (char *const *)C_c_pointer_vector_or_null(e)))
+
+ #if defined(__FreeBSD__) || defined(C_MACOSX) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sgi__) || defined(sgi) || defined(__DragonFly__) || defined(__SUNPRO_C)
+ static C_TLS int C_uw;
+@@ -1591,43 +1560,15 @@
+ (exit 0)))
+ pid)))))
+
+-(define process-execute
+- ;; NOTE: We use c-string here instead of scheme-object.
+- ;; Because set_exec_* make a copy, this implies a double copy.
+- ;; At least it's secure, we can worry about performance later, if at all
+- (let ([setarg (foreign-lambda void "C_set_exec_arg" int c-string int)]
+- [freeargs (foreign-lambda void "C_free_exec_args")]
+- [setenv (foreign-lambda void "C_set_exec_env" int c-string int)]
+- [freeenv (foreign-lambda void "C_free_exec_env")]
+- [pathname-strip-directory pathname-strip-directory] )
+- (lambda (filename #!optional (arglist '()) envlist)
+- (##sys#check-string filename 'process-execute)
+- (##sys#check-list arglist 'process-execute)
+- (let ([s (pathname-strip-directory filename)])
+- (setarg 0 s (##sys#size s)) )
+- (do ([al arglist (cdr al)]
+- [i 1 (fx+ i 1)] )
+- ((null? al)
+- (setarg i #f 0)
+- (when envlist
+- (##sys#check-list envlist 'process-execute)
+- (do ([el envlist (cdr el)]
+- [i 0 (fx+ i 1)] )
+- ((null? el) (setenv i #f 0))
+- (let ([s (car el)])
+- (##sys#check-string s 'process-execute)
+- (setenv i s (##sys#size s)) ) ) )
+- (let* ([prg (##sys#make-c-string filename 'process-execute)]
+- [r (if envlist
+- (##core#inline "C_execve" prg)
+- (##core#inline "C_execvp" prg) )] )
+- (when (fx= r -1)
+- (freeargs)
+- (freeenv)
+- (posix-error #:process-error 'process-execute "cannot execute process" filename) ) ) )
+- (let ([s (car al)])
+- (##sys#check-string s 'process-execute)
+- (setarg i s (##sys#size s)) ) ) ) ) )
++(define (process-execute filename #!optional (arglist '()) envlist)
++ (call-with-exec-args
++ 'process-execute filename (lambda (x) x) arglist envlist
++ (lambda (prg argbuf envbuf)
++ (let ((r (if envbuf
++ (##core#inline "C_u_i_execve" prg argbuf envbuf)
++ (##core#inline "C_u_i_execvp" prg argbuf) )) )
++ (when (fx= r -1)
++ (posix-error #:process-error 'process-execute "cannot execute process" filename) ) ))) )
+
+ (define-foreign-variable _wnohang int "WNOHANG")
+ (define-foreign-variable _wait-status int "C_wait_status")
+diff -r -u a/posixwin.scm b/posixwin.scm
+--- a/posixwin.scm 2016-12-22 14:06:40.016494788 -0500
++++ b/posixwin.scm 2016-12-22 14:06:55.961030020 -0500
+@@ -63,9 +63,9 @@
+
+ (declare
+ (unit posix)
+- (uses scheduler irregex extras files ports)
++ (uses scheduler irregex extras files ports lolevel)
+ (disable-interrupts)
+- (hide $quote-args-list $exec-setup $exec-teardown)
++ (hide quote-arg-string)
+ (not inline ##sys#interrupt-hook ##sys#user-interrupt-hook)
+ (foreign-declare #<<EOF
+ #ifndef WIN32_LEAN_AND_MEAN
+@@ -81,14 +81,8 @@
+ #include <utime.h>
+ #include <winsock2.h>
+
+-#define ARG_MAX 256
+ #define PIPE_BUF 512
+-#ifndef ENV_MAX
+-# define ENV_MAX 1024
+-#endif
+
+-static C_TLS char *C_exec_args[ ARG_MAX ];
+-static C_TLS char *C_exec_env[ ENV_MAX ];
+ static C_TLS struct group *C_group;
+ static C_TLS int C_pipefds[ 2 ];
+ static C_TLS time_t C_secs;
+@@ -218,39 +212,12 @@
+
+ #define C_lstat(fn) C_stat(fn)
+
+-static void C_fcall
+-C_set_arg_string(char **where, int i, char *dat, int len)
+-{
+- char *ptr;
+- if (dat)
+- {
+- ptr = (char *)C_malloc(len + 1);
+- C_memcpy(ptr, dat, len);
+- ptr[ len ] = '\0';
+- /* Can't barf() here, so the NUL byte check happens in Scheme */
+- }
+- else
+- ptr = NULL;
+- where[ i ] = ptr;
+-}
+-
+-static void C_fcall
+-C_free_arg_string(char **where) {
+- while (*where) C_free(*(where++));
+-}
+-
+-#define C_set_exec_arg(i, a, len) C_set_arg_string(C_exec_args, i, a, len)
+-#define C_set_exec_env(i, a, len) C_set_arg_string(C_exec_env, i, a, len)
+-
+-#define C_free_exec_args() (C_free_arg_string(C_exec_args), C_SCHEME_TRUE)
+-#define C_free_exec_env() (C_free_arg_string(C_exec_env), C_SCHEME_TRUE)
+-
+-#define C_execvp(f) C_fix(execvp(C_data_pointer(f), (const char *const *)C_exec_args))
+-#define C_execve(f) C_fix(execve(C_data_pointer(f), (const char *const *)C_exec_args, (const char *const *)C_exec_env))
++#define C_u_i_execvp(f,a) C_fix(execvp(C_data_pointer(f), (const char *const *)C_c_pointer_vector_or_null(a)))
++#define C_u_i_execve(f,a,e) C_fix(execve(C_data_pointer(f), (const char *const *)C_c_pointer_vector_or_null(a), (const char *const *)C_c_pointer_vector_or_null(e)))
+
+ /* MS replacement for the fork-exec pair */
+-#define C_spawnvp(m, f) C_fix(spawnvp(C_unfix(m), C_data_pointer(f), (const char *const *)C_exec_args))
+-#define C_spawnvpe(m, f) C_fix(spawnvpe(C_unfix(m), C_data_pointer(f), (const char *const *)C_exec_args, (const char *const *)C_exec_env))
++#define C_u_i_spawnvp(m,f,a) C_fix(spawnvp(C_unfix(m), C_data_pointer(f), (const char *const *)C_c_pointer_vector_or_null(a)))
++#define C_u_i_spawnvpe(m,f,a,e) C_fix(spawnvpe(C_unfix(m), C_data_pointer(f), (const char *const *)C_c_pointer_vector_or_null(a), (const char *const *)C_c_pointer_vector_or_null(e)))
+
+ #define C_open(fn, fl, m) C_fix(open(C_c_string(fn), C_unfix(fl), C_unfix(m)))
+ #define C_read(fd, b, n) C_fix(read(C_unfix(fd), C_data_pointer(b), C_unfix(n)))
+@@ -1161,74 +1128,45 @@
+ ; Windows uses a commandline style for process arguments. Thus any
+ ; arguments with embedded whitespace will parse incorrectly. Must
+ ; string-quote such arguments.
+-(define $quote-args-list
+- (lambda (lst exactf)
+- (if exactf
+- lst
+- (let ([needs-quoting?
+- ; This is essentially (string-any char-whitespace? s) but we don't
+- ; want a SRFI-13 dependency. (Do we?)
+- (lambda (s)
+- (let ([len (string-length s)])
+- (let loop ([i 0])
+- (cond
+- [(fx= i len) #f]
+- [(char-whitespace? (string-ref s i)) #t]
+- [else (loop (fx+ i 1))]))))])
+- (let loop ([ilst lst] [olst '()])
+- (if (null? ilst)
+- (##sys#fast-reverse olst)
+- (let ([str (car ilst)])
+- (loop
+- (cdr ilst)
+- (cons
+- (if (needs-quoting? str) (string-append "\"" str "\"") str)
+- olst)) ) ) ) ) ) ) )
+-
+-(define $exec-setup
+- ;; NOTE: We use c-string here instead of scheme-object.
+- ;; Because set_exec_* make a copy, this implies a double copy.
+- ;; At least it's secure, we can worry about performance later, if at all
+- (let ([setarg (foreign-lambda void "C_set_exec_arg" int c-string int)]
+- [setenv (foreign-lambda void "C_set_exec_env" int c-string int)]
+- [build-exec-argvec
+- (lambda (loc lst argvec-setter idx)
+- (if lst
+- (begin
+- (##sys#check-list lst loc)
+- (do ([l lst (cdr l)]
+- [i idx (fx+ i 1)] )
+- ((null? l) (argvec-setter i #f 0))
+- (let ([s (car l)])
+- (##sys#check-string s loc)
+- (argvec-setter i s (##sys#size s)) ) ) )
+- (argvec-setter idx #f 0) ) )])
+- (lambda (loc filename arglst envlst exactf)
+- (##sys#check-string filename loc)
+- (let ([s (pathname-strip-directory filename)])
+- (setarg 0 s (##sys#size s)) )
+- (build-exec-argvec loc (and arglst ($quote-args-list arglst exactf)) setarg 1)
+- (build-exec-argvec loc envlst setenv 0)
+- (##core#inline "C_flushall")
+- (##sys#make-c-string filename loc) ) ) )
+-
+-(define ($exec-teardown loc msg filename res)
+- (##sys#update-errno)
+- (##core#inline "C_free_exec_args")
+- (##core#inline "C_free_exec_env")
+- (if (fx= res -1)
+- (##sys#error loc msg filename)
+- res ) )
+-
+-(define (process-execute filename #!optional arglst envlst exactf)
+- (let ([prg ($exec-setup 'process-execute filename arglst envlst exactf)])
+- ($exec-teardown 'process-execute "cannot execute process" filename
+- (if envlst (##core#inline "C_execve" prg) (##core#inline "C_execvp" prg))) ) )
+-
+-(define (process-spawn mode filename #!optional arglst envlst exactf)
+- (let ([prg ($exec-setup 'process-spawn filename arglst envlst exactf)])
+- ($exec-teardown 'process-spawn "cannot spawn process" filename
+- (if envlst (##core#inline "C_spawnvpe" mode prg) (##core#inline "C_spawnvp" mode prg))) ) )
++(define quote-arg-string
++ (let ((needs-quoting?
++ ;; This is essentially (string-any char-whitespace? s) but we
++ ;; don't want a SRFI-13 dependency. (Do we?)
++ (lambda (s)
++ (let ((len (string-length s)))
++ (let loop ((i 0))
++ (cond
++ ((fx= i len) #f)
++ ((char-whitespace? (string-ref s i)) #t)
++ (else (loop (fx+ i 1)))) ) )) ))
++ (lambda (str)
++ (if (needs-quoting? str) (string-append "\"" str "\"") str) ) ) )
++
++(define (process-execute filename #!optional (arglist '()) envlist exactf)
++ (let ((argconv (if exactf (lambda (x) x) quote-arg-string)))
++ (call-with-exec-args
++ 'process-execute filename argconv arglist envlist
++ (lambda (prg argbuf envbuf)
++ (##core#inline "C_flushall")
++ (let ((r (if envbuf
++ (##core#inline "C_u_i_execve" prg argbuf envbuf)
++ (##core#inline "C_u_i_execvp" prg argbuf) )) )
++ (when (fx= r -1)
++ (posix-error #:process-error 'process-execute "cannot execute process" filename) ) ) )) ) )
++
++(define (process-spawn mode filename #!optional (arglist '()) envlist exactf)
++ (let ((argconv (if exactf (lambda (x) x) quote-arg-string)))
++ (##sys#check-exact mode 'process-spawn)
++
++ (call-with-exec-args
++ 'process-spawn filename argconv arglist envlist
++ (lambda (prg argbuf envbuf)
++ (##core#inline "C_flushall")
++ (let ((r (if envbuf
++ (##core#inline "C_u_i_spawnvpe" mode prg argbuf envbuf)
++ (##core#inline "C_u_i_spawnvp" mode prg argbuf) )) )
++ (when (fx= r -1)
++ (posix-error #:process-error 'process-spawn "cannot spawn process" filename) ) ) )) ) )
+
+ (define-foreign-variable _shlcmd c-string "C_shlcmd")
+
+@@ -1277,7 +1215,11 @@
+ ; information for the system drives. i.e !C:=...
+ ; For now any environment is ignored.
+ (lambda (loc cmd args env stdoutf stdinf stderrf #!optional exactf)
+- (let ([cmdlin (string-intersperse ($quote-args-list (cons cmd args) exactf))])
++ (let* ((arglist (cons cmd args))
++ (cmdlin (string-intersperse
++ (if exactf
++ arglist
++ (map quote-arg-string arglist)))))
+ (let-location ([handle int -1]
+ [stdin_fd int -1] [stdout_fd int -1] [stderr_fd int -1])
+ (let ([res
diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm
index 78f387faf..10e8b7c60 100644
--- a/gnu/packages/scheme.scm
+++ b/gnu/packages/scheme.scm
@@ -330,7 +330,9 @@ mashups, office (web agendas, mail clients, ...), etc.")
version "/chicken-" version ".tar.gz"))
(sha256
(base32
- "12ddyiikqknpr8h6llsxbg2fz75xnayvcnsvr1cwv8xnjn7jpp73"))))
+ "12ddyiikqknpr8h6llsxbg2fz75xnayvcnsvr1cwv8xnjn7jpp73"))
+ (patches
+ (search-patches "chicken-CVE-2016-6830+CVE-2016-6831.patch"))))
(build-system gnu-build-system)
(arguments
`(#:modules ((guix build gnu-build-system)
--
2.11.0
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
next prev parent reply other threads:[~2016-12-22 19:20 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-16 19:33 [peter@more-magic.net: Irregex packages should be updated to 0.9.6] Leo Famulari
2016-12-16 19:36 ` Chicken security bugs [was Re: [peter@more-magic.net: Irregex packages should be updated to 0.9.6]] Leo Famulari
2016-12-22 19:20 ` Kei Kebreau [this message]
2016-12-24 6:32 ` Leo Famulari
2016-12-24 19:23 ` Kei Kebreau
2016-12-24 21:04 ` Leo Famulari
2016-12-25 1:59 ` Kei Kebreau
2016-12-25 5:38 ` Kei Kebreau
2016-12-29 2:07 ` Kei Kebreau
2017-01-01 22:18 ` Leo Famulari
2017-01-02 4:04 ` Kei Kebreau
2017-01-03 5:21 ` Leo Famulari
2017-01-03 13:36 ` Kei Kebreau
2017-01-02 4:07 ` Kei Kebreau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87lgv7zs6y.fsf@openmailbox.org \
--to=kei@openmailbox.org \
--cc=guix-devel@gnu.org \
--cc=leo@famulari.name \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.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).