Compare commits

...

6 Commits

Author SHA1 Message Date
Pablo Lezaeta Reyes [pˈaβ̞lo lˌe̞θaˈeta rˈejɛ]
263327c7cd
Merge pull request #2 from dcoshea/tcl-alloc-free
xhfs: Use Tcl_Alloc()/Tcl_Free() as required when interacting with Tcl.

Signed-of-by: Pablo Lezaeta
Signed-of-by: dcochea
2018-01-18 01:36:18 -03:00
David O'Shea
e62ea3c5ac xhfs: Use Tcl_Alloc()/Tcl_Free() as required when interacting with Tcl.
On CentOS 7 with tcl-8.5.13-8, xhfs failed with SIGABRT in a number of
code paths, including cases where free() was called and eventually
resulted in munmap_chunk() reporting e.g.:

    munmap_chunk(): invalid pointer: 0x000000000089df40 ***

and cases where Tcl_Free() was called (presumably internally by Tcl)
and eventually resulted in Tcl_Panic() being called and reporting
e.g.:

    alloc: invalid block: 0xb9ce00: 95 8

The failures when calling free() were due to attempts to free memory
that was allocated using Tcl_Alloc() and similar functions (possibly
via other Tcl calls), so this fix replaces some calls to free() with
calls to Tcl_Free().

The failures when calling Tcl_Free() were due to Tcl calling that
function for memory that was passed to it via Tcl_SetResult(..., ...,
TCL_DYNAMIC) when that memory had been allocated using malloc() or
similar functions, so this fix replaces a call to ALLOC() with a call
to Tcl_Alloc(), and copies the malloc()'d buffer returned by
cs_macroman() or cs_latin1() into a Tcl_Alloc()'d buffer.
2018-01-11 20:41:34 +10:30
Pablo Lezaeta Reyes
b6df6a4599
Fixed compilation with tcl-8.6+
Signed-off-by: Pablo Lezaeta Reyes <prflr88@gmail.com>
2017-09-27 00:18:41 -03:00
Pablo Lezaeta Reyes
45b8c14fd1
Add support for files larger than 2 GB, like any dvd image
Signed-off-by: Pablo Lezaeta Reyes <prflr88@gmail.com>
2017-09-27 00:18:10 -03:00
Pablo Lezaeta Reyes
81a6c106d4
Fix the errno issue on glibc-2.3.2+
Signed-off-by: Pablo Lezaeta Reyes <prflr88@gmail.com>
2017-09-27 00:17:37 -03:00
Pablo Lezaeta Reyes
ca2d077127
Fixed Makefile patch
Signed-off-by: Pablo Lezaeta Reyes <prflr88@gmail.com>
2017-09-27 00:16:42 -03:00
4 changed files with 27 additions and 21 deletions

View File

@ -36,7 +36,7 @@ INCDEST = @includedir@
MANEXT = 1
INSTALL = @INSTALL@
INSTALL = @INSTALL@ -D
BININSTALL = @INSTALL_PROGRAM@ -m 755
LIBINSTALL = @INSTALL_DATA@
HARDLINK = ln -f
@ -111,7 +111,7 @@ check :: all
install :: @INSTALL_TARGETS@
install_cli :: all_cli
$(BININSTALL) $(HFSUTIL) "$(BINDEST)/."
$(BININSTALL) $(HFSUTIL) "$(BINDEST)/$(HFSUTIL)"
for file in $(CLITARGETS); do \
$(HARDLINK) "$(BINDEST)/$(HFSUTIL)" "$(BINDEST)/$$file"; \
@ -126,7 +126,7 @@ install_cli :: all_cli
install_tcl :: all_tcl
for file in $(TCLTARGETS); do \
$(BININSTALL) $$file "$(BINDEST)/."; \
$(BININSTALL) $$file "$(BINDEST)/$$file"; \
done
if [ -f "$(BINDEST)/hfs" ]; then \
@ -142,7 +142,7 @@ install_tcl :: all_tcl
install_tk :: all_tk
for file in $(TKTARGETS); do \
$(BININSTALL) $$file "$(BINDEST)/."; \
$(BININSTALL) $$file "$(BINDEST)/$(TKTARGETS)"; \
done
for file in $(TKDOCS); do \

View File

@ -91,3 +91,5 @@ char *strstr(const char *, const char *);
# ifndef HAVE_STRTOL
long strtol(const char *, char **, int);
# endif
#define USE_INTERP_RESULT 1

View File

@ -19,6 +19,11 @@
* $Id: unix.c,v 1.8 1998/11/02 22:09:13 rob Exp $
*/
#ifdef __linux__
#define _FILE_OFFSET_BITS 64
#define _LARGE_FILES
#endif
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif

View File

@ -43,8 +43,7 @@
# include "charset.h"
# include "suid.h"
# include "version.h"
extern int errno;
# include <errno.h>
# define ERROR(code, str) (hfs_error = (str), errno = (code))
@ -228,7 +227,7 @@ int getdir(Tcl_Interp *interp, volref *vref, const char *path)
Tcl_AppendElement(interp, str);
free(str);
Tcl_Free(str);
}
if (hfs_closedir(dir) == -1)
@ -245,7 +244,7 @@ int getdir(Tcl_Interp *interp, volref *vref, const char *path)
Tcl_AppendElement(interp, str);
free(str);
Tcl_Free(str);
}
return TCL_OK;
@ -379,17 +378,12 @@ int file_cmd(ClientData clientData, Tcl_Interp *interp,
return TCL_ERROR;
}
mem = ALLOC(char, bytes + 1);
if (mem == 0)
{
interp->result = "out of memory";
return TCL_ERROR;
}
mem = Tcl_Alloc(bytes + 1);
bytes = hfs_read(file, mem, bytes);
if (bytes == -1)
{
free(mem);
Tcl_Free(mem);
return error(interp, 0);
}
@ -903,7 +897,7 @@ int vol_cmd(ClientData clientData, Tcl_Interp *interp,
}
result = Tcl_Merge(listc, listv);
free(listv);
Tcl_Free(listv);
Tcl_SetResult(interp, result, TCL_DYNAMIC);
}
@ -1048,7 +1042,7 @@ int vol_cmd(ClientData clientData, Tcl_Interp *interp,
}
result = Tcl_Merge(fargc, fargv);
free(fargv);
Tcl_Free(fargv);
Tcl_SetResult(interp, result, TCL_DYNAMIC);
}
@ -1314,7 +1308,7 @@ int cmd_hfs(ClientData clientData, Tcl_Interp *interp,
badblocks = ALLOCX(unsigned long, listc);
if (listc && badblocks == 0)
{
free(listv);
Tcl_Free(listv);
interp->result = "out of memory";
return TCL_ERROR;
@ -1325,13 +1319,13 @@ int cmd_hfs(ClientData clientData, Tcl_Interp *interp,
if (Tcl_ExprLong(interp, listv[i],
(long *) &badblocks[i]) != TCL_OK)
{
free(listv);
Tcl_Free(listv);
FREE(badblocks);
return TCL_ERROR;
}
}
free(listv);
Tcl_Free(listv);
if (do_format(argv[2], partno, 0, argv[4], listc, badblocks) == -1)
{
@ -1353,6 +1347,7 @@ int cmd_hfs(ClientData clientData, Tcl_Interp *interp,
else if (strcmp(argv[1], "chartrans") == 0)
{
char *result;
char *tclresult;
if (argc != 5)
{
@ -1388,7 +1383,11 @@ int cmd_hfs(ClientData clientData, Tcl_Interp *interp,
return TCL_ERROR;
}
Tcl_SetResult(interp, result, TCL_DYNAMIC);
tclresult = Tcl_Alloc(strlen(result) + 1);
memcpy(tclresult, result, strlen(result) + 1);
free(result);
Tcl_SetResult(interp, tclresult, TCL_DYNAMIC);
}
else if (strcmp(argv[1], "version") == 0)
{