From f0049b4b2ea55b3b3c53bf6f0275654801c755d2 Mon Sep 17 00:00:00 2001 From: Li Zhou Date: Thu, 28 Sep 2017 15:54:55 +0800 Subject: [PATCH] expect: Fix segfaults if Tcl is built with stubs and Expect is used directly from C program Description: This dirty hack fixes segfaults if Tcl is built with stubs and Expect is used directly from C program. Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=588817 Example: #include #include int main() { FILE *pipe; char *some_command = "uname"; char datum; pipe = exp_popen(some_command); if (pipe == NULL) return 1; while ((datum = getc (pipe)) != EOF) printf("%c",datum); } Example: #include #include "expect.h" main() { int fd = 0; fd = exp_spawnl("echo", "echo", "Hello User: Whats up?", (char*) 0); switch (exp_expectl(fd, exp_regexp, "ser:", 1, exp_end)) { case 1: { printf("GOT ser:\n"); break; } default: { printf("DEFAULT\n"); return 1; } } printf("Normal Exit\n"); return 0; } Author: Sergei Golovan Upstream-Status: Pending This patch is backported from fedora changes for expect: http://pkgs.fedoraproject.org/cgit/rpms/expect.git/commit/ ?h=master&id=b6737eed550be93182f2ed194e836a6cbbcf4fa3 Signed-off-by: Li Zhou --- exp_clib.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/exp_clib.c b/exp_clib.c index 172c05e..19341d5 100644 --- a/exp_clib.c +++ b/exp_clib.c @@ -114,7 +114,11 @@ extern unsigned long strtoul _ANSI_ARGS_((CONST char *string, #include /* for malloc */ #endif -#include +#define ckalloc(x) Tcl_Alloc(x) +#define ckfree(x) Tcl_Free(x) +extern char *Tcl_ErrnoMsg(int err); +extern char *Tcl_Alloc(unsigned int size); +extern void Tcl_Free(char *ptr); #include "expect.h" #define TclRegError exp_TclRegError @@ -389,7 +393,7 @@ char *exp; FAIL("regexp too big"); /* Allocate space. */ - r = (regexp *)ckalloc(sizeof(regexp) + (unsigned)rcstate->regsize); + r = (regexp *)malloc(sizeof(regexp) + (unsigned)rcstate->regsize); if (r == NULL) FAIL("out of space"); @@ -399,7 +403,7 @@ char *exp; rcstate->regcode = r->program; regc(MAGIC, rcstate); if (reg(0, &flags, rcstate) == NULL) { - ckfree ((char*) r); + free((char*) r); return(NULL); } -- 1.9.1