Subject: bug#18680: closed (Re: [PATCH] Check if argv[0] is NULL in scm_boot_guile to avoid segfault)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 11 Oct 2014 17:07:03 +0000

Your bug report

#18680: [PATCH] Check if argv[0] is NULL in scm_boot_guile to avoid segfault

which was filed against the guile package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
18680: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=18680
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: [PATCH] Check if argv[0] is NULL in scm_boot_guile to avoid segfault
From: Mark H Weaver <[email-masked]>
To: Nala Ginrut <[email-masked]>
Cc: [email-masked], Andy Wingo <[email-masked]>, Eli Zaretskii <[email-masked]>, [email-masked]
Date: Sat, 11 Oct 2014 13:05:45 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

Nala Ginrut <[email-masked]> writes:

> This patch is for master branch, but the bug also appears in the
> current stable-2.0 I think.
>
> With the recent patch from Eli Zaretskii, there'd be one more step for argv[0]:
> scm_i_mirror_backslashes (argv[0]);
>
> But this cause my program segfault, since I have such line:
> scm_boot_guile(0, {NULL}, &guilemain, NULL);
>
> According to C11, it's allowed[1].
> argv[argc] should be NULL.
> If the value of argc is greater than zero, the string pointed to by argv[0]
> represents the program name. But if argc is zero, argv[0] will be NULL, so
> we have to check it first to avoid segfault.

Fixed in b9ace68613395fda26f3f3d7dc2ac9bc52cd7f2a on the stable-2.0
branch.  It'll go into master on the next merge.

     Thanks,
       Mark

Subject: [PATCH] Check if argv[0] is NULL in scm_boot_guile to avoid segfault
From: Nala Ginrut <[email-masked]>
To: guile-devel <[email-masked]>, Eli Zaretskii <[email-masked]>, Andy Wingo <[email-masked]>, [email-masked], Mark H Weaver <[email-masked]>
Date: Sat, 11 Oct 2014 00:15:25 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

This patch is for master branch, but the bug also appears in the
current stable-2.0 I think.

With the recent patch from Eli Zaretskii, there'd be one more step for argv[0]:
scm_i_mirror_backslashes (argv[0]);

But this cause my program segfault, since I have such line:
scm_boot_guile(0, {NULL}, &guilemain, NULL);

According to C11, it's allowed[1].
argv[argc] should be NULL.
If the value of argc is greater than zero, the string pointed to by argv[0]
represents the program name. But if argc is zero, argv[0] will be NULL, so
we have to check it first to avoid segfault.

Attached patch fixed this.

[1] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
From b6938156fe1ca2ba8a7db167604618eea31282f1 Mon Sep 17 00:00:00 2001
From: Nala Ginrut <[email-masked]>
Date: Fri, 10 Oct 2014 23:54:24 +0800
Subject: [PATCH] Check argv[0] if it's NULL in scm_boot_guile

According to C11, argv[argc] should be NULL.
If the value of argc is greater than zero, the string pointed to by argv[0]
represents the program name. But if argc is zero, argv[0] will be NULL, so
we have to check it first to avoid segfault.

* libguile/init.c
---
 libguile/init.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libguile/init.c b/libguile/init.c
index d2928bd..e11115c 100644
--- a/libguile/init.c
+++ b/libguile/init.c
@@ -311,8 +311,14 @@ scm_boot_guile (int argc, char ** argv, void (*main_func) (), void *closure)
   struct main_func_closure c;
 
   /* On Windows, convert backslashes in argv[0] to forward
-     slashes.  */
-  scm_i_mirror_backslashes (argv[0]);
+     slashes.
+     According to C11, argv[argc] should be NULL.
+     If the value of argc is greater than zero, the string pointed to by argv[0]
+     represents the program name. But if argc is zero, argv[0] will be NULL, so
+     we have to check it first to avoid segfault.
+   */
+  if (argc)
+    scm_i_mirror_backslashes (argv[0]);
   c.main_func = main_func;
   c.closure = closure;
   c.argc = argc;
-- 
1.7.10.4