mirror of
https://git.yoctoproject.org/poky
synced 2026-06-02 13:29:49 +00:00
expect: Fix segfaults when Expect clib is used directly from C program
Fix segfaults if Tcl is built with stubs and Expect clib function is used directly from C program. (From OE-Core rev: 44af4f20bfb1fe853ed0b5dfc76bdd2900f47cb0) Signed-off-by: Li Zhou <li.zhou@windriver.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
+91
@@ -0,0 +1,91 @@
|
||||
From f0049b4b2ea55b3b3c53bf6f0275654801c755d2 Mon Sep 17 00:00:00 2001
|
||||
From: Li Zhou <li.zhou@windriver.com>
|
||||
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 <stdio.h>
|
||||
#include <tcl8.5/expect.h>
|
||||
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 <stdio.h>
|
||||
#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 <sgolovan@debian.org>
|
||||
|
||||
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 <li.zhou@windriver.com>
|
||||
---
|
||||
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 <stdlib.h> /* for malloc */
|
||||
#endif
|
||||
|
||||
-#include <tcl.h>
|
||||
+#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
|
||||
|
||||
@@ -26,6 +26,7 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/expect/Expect/${PV}/${BPN}${PV}.tar.gz \
|
||||
file://01-example-shebang.patch \
|
||||
file://0001-expect-install-scripts-without-using-the-fixline1-tc.patch \
|
||||
file://0001-Resolve-string-formatting-issues.patch \
|
||||
file://0001-expect-Fix-segfaults-if-Tcl-is-built-with-stubs-and-.patch \
|
||||
"
|
||||
SRC_URI[md5sum] = "44e1a4f4c877e9ddc5a542dfa7ecc92b"
|
||||
SRC_URI[sha256sum] = "b28dca90428a3b30e650525cdc16255d76bb6ccd65d448be53e620d95d5cc040"
|
||||
|
||||
Reference in New Issue
Block a user