Avoided use of function alloca() by macro Libisofs_avoid_using_allocA
and incremented version to 0.6.17
This commit is contained in:
parent
a6090a6273
commit
50edfbea51
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libisofs], [0.6.16], [http://libburnia-project.org])
|
AC_INIT([libisofs], [0.6.17], [http://libburnia-project.org])
|
||||||
AC_PREREQ([2.50])
|
AC_PREREQ([2.50])
|
||||||
dnl AC_CONFIG_HEADER([config.h])
|
dnl AC_CONFIG_HEADER([config.h])
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
|
|||||||
dnl
|
dnl
|
||||||
LIBISOFS_MAJOR_VERSION=0
|
LIBISOFS_MAJOR_VERSION=0
|
||||||
LIBISOFS_MINOR_VERSION=6
|
LIBISOFS_MINOR_VERSION=6
|
||||||
LIBISOFS_MICRO_VERSION=16
|
LIBISOFS_MICRO_VERSION=17
|
||||||
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
||||||
|
|
||||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "filesrc.h"
|
#include "filesrc.h"
|
||||||
#include "eltorito.h"
|
#include "eltorito.h"
|
||||||
|
#include "libisofs.h"
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -296,7 +298,13 @@ int joliet_create_mangled_name(uint16_t *dest, uint16_t *src, int digits,
|
|||||||
int ret, pos;
|
int ret, pos;
|
||||||
uint16_t *ucsnumber;
|
uint16_t *ucsnumber;
|
||||||
char fmt[16];
|
char fmt[16];
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
char nstr[72]; /* The only caller of this function allocates dest with 66
|
||||||
|
elements and limits digits to < 8 */
|
||||||
|
#else
|
||||||
char *nstr = alloca(digits + 1);
|
char *nstr = alloca(digits + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
sprintf(fmt, "%%0%dd", digits);
|
sprintf(fmt, "%%0%dd", digits);
|
||||||
sprintf(nstr, fmt, number);
|
sprintf(nstr, fmt, number);
|
||||||
@ -372,6 +380,11 @@ int mangle_single_dir(Ecma119Image *t, JolietNode *dir)
|
|||||||
* A max of 7 characters is good enought, it allows handling up to
|
* A max of 7 characters is good enought, it allows handling up to
|
||||||
* 9,999,999 files with same name.
|
* 9,999,999 files with same name.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
/* Important: joliet_create_mangled_name() relies on digits < 72 */
|
||||||
|
#endif
|
||||||
|
|
||||||
while (digits < 8) {
|
while (digits < 8) {
|
||||||
int ok, k;
|
int ok, k;
|
||||||
uint16_t *dot;
|
uint16_t *dot;
|
||||||
|
@ -997,7 +997,7 @@ int iso_lib_is_compatible(int major, int minor, int micro);
|
|||||||
*/
|
*/
|
||||||
#define iso_lib_header_version_major 0
|
#define iso_lib_header_version_major 0
|
||||||
#define iso_lib_header_version_minor 6
|
#define iso_lib_header_version_minor 6
|
||||||
#define iso_lib_header_version_micro 16
|
#define iso_lib_header_version_micro 17
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Usage discussion:
|
* Usage discussion:
|
||||||
@ -4785,6 +4785,14 @@ struct burn_source {
|
|||||||
#define Libisofs_rrip_1_10_er_bugfiX yes
|
#define Libisofs_rrip_1_10_er_bugfiX yes
|
||||||
|
|
||||||
|
|
||||||
|
/* Portability: Avoid use of function alloca().
|
||||||
|
|
||||||
|
Solaris demands to include <alloca,h>, FreeBSD has no such
|
||||||
|
file. It seems wiser to replace alloca() by calloc() and free()
|
||||||
|
*/
|
||||||
|
#define Libisofs_avoid_using_allocA yes
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------- Experiments ---------------------------- */
|
/* ---------------------------- Experiments ---------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
101
libisofs/util.c
101
libisofs/util.c
@ -191,15 +191,22 @@ int strconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
iconv_t conv;
|
iconv_t conv;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *out;
|
char *out = NULL;
|
||||||
char *src;
|
char *src;
|
||||||
char *ret;
|
char *ret;
|
||||||
|
int retval;
|
||||||
|
|
||||||
inbytes = strlen(str);
|
inbytes = strlen(str);
|
||||||
outbytes = (inbytes + 1) * MB_LEN_MAX;
|
outbytes = (inbytes + 1) * MB_LEN_MAX;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
out = calloc(outbytes, 1);
|
||||||
|
#else
|
||||||
out = alloca(outbytes);
|
out = alloca(outbytes);
|
||||||
|
#endif
|
||||||
if (out == NULL) {
|
if (out == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
retval = ISO_OUT_OF_MEM;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Libisofs_with_iso_iconV
|
#ifdef Libisofs_with_iso_iconV
|
||||||
@ -210,7 +217,8 @@ int strconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
if (conv == (iconv_t)(-1)) {
|
if (conv == (iconv_t)(-1)) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ISO_CHARSET_CONV_ERROR;
|
retval = ISO_CHARSET_CONV_ERROR;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
src = (char *)str;
|
src = (char *)str;
|
||||||
@ -228,7 +236,8 @@ int strconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
iconv_close(conv);
|
iconv_close(conv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ISO_CHARSET_CONV_ERROR;
|
retval = ISO_CHARSET_CONV_ERROR;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
*ret = '\0';
|
*ret = '\0';
|
||||||
|
|
||||||
@ -240,10 +249,20 @@ int strconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
|
|
||||||
*output = malloc(ret - out + 1);
|
*output = malloc(ret - out + 1);
|
||||||
if (*output == NULL) {
|
if (*output == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
retval = ISO_OUT_OF_MEM;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
memcpy(*output, out, ret - out + 1);
|
memcpy(*output, out, ret - out + 1);
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
|
|
||||||
|
ex:;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
if (out != NULL)
|
||||||
|
free(out);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strnconv(const char *str, const char *icharset, const char *ocharset,
|
int strnconv(const char *str, const char *icharset, const char *ocharset,
|
||||||
@ -260,15 +279,23 @@ int strnconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
iconv_t conv;
|
iconv_t conv;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *out;
|
char *out = NULL;
|
||||||
char *src;
|
char *src;
|
||||||
char *ret;
|
char *ret;
|
||||||
|
int retval;
|
||||||
|
|
||||||
inbytes = len;
|
inbytes = len;
|
||||||
outbytes = (inbytes + 1) * MB_LEN_MAX;
|
outbytes = (inbytes + 1) * MB_LEN_MAX;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
out = calloc(outbytes, 1);
|
||||||
|
#else
|
||||||
out = alloca(outbytes);
|
out = alloca(outbytes);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (out == NULL) {
|
if (out == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
retval = ISO_OUT_OF_MEM;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Libisofs_with_iso_iconV
|
#ifdef Libisofs_with_iso_iconV
|
||||||
@ -279,7 +306,8 @@ int strnconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
if (conv == (iconv_t)(-1)) {
|
if (conv == (iconv_t)(-1)) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ISO_CHARSET_CONV_ERROR;
|
retval = ISO_CHARSET_CONV_ERROR;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
src = (char *)str;
|
src = (char *)str;
|
||||||
ret = (char *)out;
|
ret = (char *)out;
|
||||||
@ -296,7 +324,8 @@ int strnconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
iconv_close(conv);
|
iconv_close(conv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ISO_CHARSET_CONV_ERROR;
|
retval = ISO_CHARSET_CONV_ERROR;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
*ret = '\0';
|
*ret = '\0';
|
||||||
|
|
||||||
@ -308,10 +337,20 @@ int strnconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
|
|
||||||
*output = malloc(ret - out + 1);
|
*output = malloc(ret - out + 1);
|
||||||
if (*output == NULL) {
|
if (*output == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
retval = ISO_OUT_OF_MEM;
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
memcpy(*output, out, ret - out + 1);
|
memcpy(*output, out, ret - out + 1);
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
|
|
||||||
|
ex:;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
if (out != NULL)
|
||||||
|
free(out);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -934,10 +973,20 @@ char *iso_r_fileid(const char *src, size_t len, int relaxed, int forcedot)
|
|||||||
{
|
{
|
||||||
char *dot;
|
char *dot;
|
||||||
int lname, lext, lnname, lnext, pos, i;
|
int lname, lext, lnname, lnext, pos, i;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
char *dest = NULL;
|
||||||
|
|
||||||
|
dest = calloc(len + 1 + 1, 1);
|
||||||
|
if (dest == NULL)
|
||||||
|
goto ex;
|
||||||
|
#else
|
||||||
char *dest = alloca(len + 1 + 1);
|
char *dest = alloca(len + 1 + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (src == NULL) {
|
if (src == NULL) {
|
||||||
return NULL;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
dot = strrchr(src, '.');
|
dot = strrchr(src, '.');
|
||||||
@ -962,7 +1011,7 @@ char *iso_r_fileid(const char *src, size_t len, int relaxed, int forcedot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lnname == 0 && lnext == 0) {
|
if (lnname == 0 && lnext == 0) {
|
||||||
return NULL;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
@ -1019,6 +1068,15 @@ char *iso_r_fileid(const char *src, size_t len, int relaxed, int forcedot)
|
|||||||
}
|
}
|
||||||
dest[pos] = '\0';
|
dest[pos] = '\0';
|
||||||
return strdup(dest);
|
return strdup(dest);
|
||||||
|
|
||||||
|
ex:;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
if (dest != NULL)
|
||||||
|
free(dest);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t *iso_j_file_id(const uint16_t *src)
|
uint16_t *iso_j_file_id(const uint16_t *src)
|
||||||
@ -1537,7 +1595,7 @@ void strncpy_pad(char *dest, const char *src, size_t max)
|
|||||||
char *ucs2str(const char *buf, size_t len)
|
char *ucs2str(const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
size_t outbytes, inbytes;
|
size_t outbytes, inbytes;
|
||||||
char *str, *src, *out;
|
char *str, *src, *out = NULL;
|
||||||
|
|
||||||
#ifdef Libisofs_with_iso_iconV
|
#ifdef Libisofs_with_iso_iconV
|
||||||
struct iso_iconv_handle conv;
|
struct iso_iconv_handle conv;
|
||||||
@ -1553,7 +1611,11 @@ char *ucs2str(const char *buf, size_t len)
|
|||||||
outbytes = (inbytes+1) * MB_LEN_MAX;
|
outbytes = (inbytes+1) * MB_LEN_MAX;
|
||||||
|
|
||||||
/* ensure enought space */
|
/* ensure enought space */
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
out = calloc(outbytes, 1);
|
||||||
|
#else
|
||||||
out = alloca(outbytes);
|
out = alloca(outbytes);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* convert to local charset */
|
/* convert to local charset */
|
||||||
|
|
||||||
@ -1570,7 +1632,7 @@ char *ucs2str(const char *buf, size_t len)
|
|||||||
if (conv == (iconv_t)(-1)) {
|
if (conv == (iconv_t)(-1)) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return NULL;
|
goto ex;
|
||||||
}
|
}
|
||||||
src = (char *)buf;
|
src = (char *)buf;
|
||||||
str = (char *)out;
|
str = (char *)out;
|
||||||
@ -1586,7 +1648,7 @@ char *ucs2str(const char *buf, size_t len)
|
|||||||
|
|
||||||
if (n == -1) {
|
if (n == -1) {
|
||||||
/* error */
|
/* error */
|
||||||
return NULL;
|
goto ex;
|
||||||
}
|
}
|
||||||
*str = '\0';
|
*str = '\0';
|
||||||
|
|
||||||
@ -1594,6 +1656,15 @@ char *ucs2str(const char *buf, size_t len)
|
|||||||
for (len = strlen(out) - 1; out[len] == ' ' && len > 0; --len)
|
for (len = strlen(out) - 1; out[len] == ' ' && len > 0; --len)
|
||||||
out[len] = '\0';
|
out[len] = '\0';
|
||||||
return strdup(out);
|
return strdup(out);
|
||||||
|
|
||||||
|
ex:;
|
||||||
|
|
||||||
|
#ifdef Libisofs_avoid_using_allocA
|
||||||
|
if (out != NULL)
|
||||||
|
free(out);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void iso_lib_version(int *major, int *minor, int *micro)
|
void iso_lib_version(int *major, int *minor, int *micro)
|
||||||
|
Loading…
Reference in New Issue
Block a user